 	init(initialValue: T, generator: SinkOf<T> -> ()) {
 		_current = initialValue
 
-		generator(SinkOf { value in
-			dispatch_barrier_sync(self._queue) {
-				self._current = value
-
-				for sinkBox in self._observers {
-					sinkBox.value.put(value)
+		// Save the generator closure so that anything it captures (e.g.,
+		// another Signal dependency) remains alive while this Signal object is
+		// too.
+		_generator = generator
+
+		_generator(SinkOf { [weak self] value in
+			if let strongSelf = self {
+				dispatch_barrier_sync(strongSelf._queue) {
+					strongSelf._current = value
+
+					for sinkBox in strongSelf._observers {
+						sinkBox.value.put(value)
+					}
 				}
 			}
 		})

/// A push-driven stream that sends the same values to all observers.
@final class Signal<T> {
	let _queue = dispatch_queue_create("com.github.ReactiveCocoa.Signal", DISPATCH_QUEUE_CONCURRENT)
	var _current: T? = nil
	var _observers: [Box<SinkOf<T>>] = []


	func buffer(capacity: Int? = nil) -> (Producer<T>, Disposable) {
		let buffer = EventBuffer<T>(capacity: capacity)

		// TODO: How does `self` get retained properly?
		let observationDisposable = self.observe { value in
			buffer.put(.Next(Box(value)))
		}
