爲什麼不堅持使用NSNotificationCenter的對象進行調用,我在下面包含了一個簡單版本的代碼。在創建觀察通知的對象以及通知被觸發時,它將刪除觀察者的訂閱。如果對象被釋放,我也刪除訂閱。但是,在運行應用程序分析時,您可以看到在viewDidAppear完成後,測試對象的持久分配現在爲零,應該已釋放。爲什麼會這樣?使用NSNotificationCenter時ARC無法正常工作
import UIKit
class ViewController: UIViewController {
var t: test?
override func viewWillAppear(animated: Bool) {
t = test()
fire()
t = nil
}
func fire() {
NSNotificationCenter.defaultCenter().postNotificationName("Hello",
object: nil)
}
}
class test {
var e: NSObjectProtocol?
init() {
e = NSNotificationCenter.defaultCenter().addObserverForName(
"Hello", object: nil, queue: NSOperationQueue.mainQueue(),
usingBlock: sayHello)
}
deinit {
if let e = e { NSNotificationCenter.defaultCenter().removeObserver(e) }
}
func sayHello(notification: NSNotification) {
if let e = e { NSNotificationCenter.defaultCenter().removeObserver(e) }
}
}
即使在Objective-C中我也會很感激,因爲它也可能會回答這個問題。
非常感謝你
我會爲你打開美國:IOS中沒有垃圾回收器。並且在OS X中很久以前。 –
我的意思是說ARC – luis
檢查'addObserverForName'的返回類型,所以在這種情況下''self'不是'obser'。而且我認爲,當您將封閉傳遞給通知中心時,您應該使用'[weak self]',以便沒有保留週期。 –