当前位置:  开发笔记 > IOS > 正文

使用NSNotificationCenter时,ARC无法正常工作

如何解决《使用NSNotificationCenter时,ARC无法正常工作》经验,为你挑选了1个好方法。

为什么不在使用NSNotificationCenter的对象上调用deist,我在下面包含了我的代码的简单版本.在我创建一个观察通知的对象以及触发通知时,它会删除观察者的订阅.如果释放了对象,我也会删除订阅.但是,在为应用程序运行性能分析时,您可以看到在viewDidAppear完成后,测试对象的持久分配现在为零,应该已经释放.为什么会这样?

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中,我也会很感激,因为它也可能会回答这个问题.

非常感谢你



1> Rich..:

传递self作为闭包参数的函数将创建保留周期.你正在做的是有效率的短手:

init() {
   e = NSNotificationCenter.defaultCenter().addObserverForName("Hello", object: nil, queue: NSOperationQueue.mainQueue() { notification in 
      self.sayHello(notification) 
   }
}

正如你所看到self的那样被捕获.为了解决这个问题,你应该定义selfunowned在捕获列表:

init() {
   e = NSNotificationCenter.defaultCenter().addObserverForName("Hello", object: nil, queue: NSOperationQueue.mainQueue() { [unowned self] notification in 
      self.sayHello(notification) 
   }
}

这将阻止保留周期.

正如您删除观察者sayHello,你也应该设置enil在那里移除观察者后了.

有关使用此方法时保留周期,捕获等的详细信息,请参阅此问题NSNotificationCenter.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有