let observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, CFRunLoopActivity.BeforeWaiting.rawValue, false, 0, { (observer, activity) in
self.doSomething()
})
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, UITrackingRunLoopMode)
我在UIViewController中添加一个观察者到主runloop,这意味着self是UIViewController的一个实例。上面的代码创建了一个保留周期,导致控制器永远不会被释放。添加观察员runloop创建保留周期
我知道我可以声明[weak self]或[unowned self]来解决问题。我想问一下,retian循环是什么样的?我只知道这个街区能够以强烈的参照捕捉自我。
我确信我没有将观察者存储在强实例变量中。如果我没有宣布自己是弱自我的,那么它就永远不会被释放, – itenyh
你是否曾经从运行循环中移除观察者?如果您不从运行循环中删除观察者,那么观察者将永远不会被释放。如果观察者永远不会被释放,块将永远不会被释放。如果该块永远不会被释放,视图控制器将永远不会被释放。这并不意味着有一个保留周期! –