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)的主要内容,如果未能解决你的问题,请参考以下文章

ios:ARC中的过度释放对象[关闭]

强制对象在 ARC 下释放

移除对象时内存未释放 - 不清楚在 ARC 中释放的正确方法

iOS 内存管理

ARC模式下操作对象无效,检查对象是否被自动释放掉

iOS开发-34自己主动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容