iOS:释放正在使用的对象 (ARC)
Posted
技术标签:
【中文标题】iOS:释放正在使用的对象 (ARC)【英文标题】:iOS: Releasing Object Thats In Use (ARC) 【发布时间】:2012-09-12 03:20:28 【问题描述】:我创建了一个订阅一些 NSNotificationCenter 通知的对象,但它正在被释放,因为我没有指向实例化的指针。实例化有一个委托,它将调用一个方法回我拥有的另一个类,所以我觉得没有必要也有一个指向它的指针,因为指针没有任何用途。
基本上,我有一个类的实例化,DelegateListener(名称仅用于示例目的),它订阅了一些默认的NSNotificationCeneter
的通知。在实例化结束后,该实例化不会分配给任何指针。然而,实例化有一个属性,委托。我在实例化期间为该委托分配了一个值。该委托实现了我希望 DelegateListener 在其订阅的通知触发时调用的方法。
这样做的问题是我创建的 DelegateListener 的实例化被释放,除非我将它分配给一个保留的指针。有没有办法避免在 ARC 中自动释放我的 DelegateListener 实例?
【问题讨论】:
【参考方案1】:如果您没有多个 DelegateListener
实例,则应将它们存储在静态变量中。
我觉得没有必要也有一个指向它的指针,因为指针没有任何用途。
指针确实(或至少应该)服务于一个目的:当您不再需要收听通知时,您应该取消订阅DelegateListener
接收它们。至少,当您的应用程序进入后台(除非它的目的是执行后台处理)以及您的应用程序终止时,应该会发生这种情况。
[[NSNotificationCenter defaultCenter] removeObserver:delegateListener];
【讨论】:
我让代理返回 nil 并且我在 dealloc 时取消订阅通知。但你是说我应该保持指向它的静态指针,因为这是唯一的方法,呵呵。 好吧,如果它在dealloc
上取消订阅,那么当 ARC 清理它时,它就会取消订阅。所以你的代表变得没用了。保留一个指向它的静态指针,然后在您希望它取消订阅时将侦听器设置为nil
,您的dealloc
将按照您的说法处理它。
@darvidsOn 那么,当没有指针,但它持有一个保留类的委托时,它会自动释放吗?这不烦人吗?
除非委托保留其所有者,否则这是非常标准的行为。运行时没有看到任何对象持有对委托侦听器的引用,因此假设没有对象能够引用该内存地址处的任何内容,并且内存已被清理。
根据this的回答,它没有指针。以上是关于iOS:释放正在使用的对象 (ARC)的主要内容,如果未能解决你的问题,请参考以下文章