【问题标题】:Why the return value does not release为什么返回值不释放
【发布时间】:2015-01-20 13:42:00
【问题描述】:

我有一些类似的代码:

- (SendFileInfo *)sendFileInfoForName:(NSString *)name {
    for (SendFileInfo *sendFileInfo in sendArray)
    {
        if ([sendFileInfo.name isEqualToString:name])
        {
            return sendFileInfo;
        }
    }
    return nil;
}

所以这个方法的返回值会是autorelease。我用instruments来跟踪SendFileInfo的retain/release事件;有时候SendFileInfo会在autorelease后释放,就像:

Retain/Autorelease/Release (3) 00:48.146.622 ipjsua -[SendFileQueue sendFileInfoForName:]

Retain  +1  5   00:48.146.622   ipjsua  -[SendFileQueue sendFileInfoForName:]

Autorelease         00:48.146.627   ipjsua  -[SendMessageViewController refreshSendFileView:]

Release -1  4   00:48.155.558   GraphicsServices    GSEventRunModal

但有时没有释放动作,所以不会释放这个对象的内存。

Retain/Autorelease (2)  +1      00:46.996.752   ipjsua  -[SendFileQueue sendFileInfoForName:]

Retain  +1  2   00:46.996.752   ipjsua  -[SendFileQueue sendFileInfoForName:]

Autorelease         00:46.996.756   ipjsua  -[SendMessageViewController refreshSendFileView:]

最终,SendFileInfo 对象的引用计数等于调用 sendFileInfoForName 方法的时间(自动释放后不释放)。内存泄漏! 发布事件何时发生?为什么释放事件不以相同的方式发生?

【问题讨论】:

  • 您返回的对象不受该代码额外保留的影响,因为已知它由容器对象保留。如果您实际查看上面的跟踪信息,您会发现您的第二种情况缺少 GraphicsServices 发布的版本,该版本在上述代码之外。
  • (我不熟悉 GraphicsServices,但您以某种方式启用了一个事件处理程序或诸如此类的问题对象作为它的“数据”值。如果该事件处理程序从未被触发或取消您的对象仍然保留。)

标签: ios objective-c memory-management autorelease


【解决方案1】:

当不再引用一个对象时,该对象将被释放。但是,您返回的对象仍由数组 sendArray 强烈保留。一旦离开该集合,它就会被释放。

所有类型的集合、NSArrays、NSSets 和 NSDictionaries 都将强烈引用您添加的对象,这意味着它们将在数组的生命周期内“存活”。

【讨论】:

  • 我知道。而且我非常确定该对象已从集合中删除。此事件->(Release -1 4 00:48.155.558 GraphicsServices GSEventRunModal)发生在从集合中删除对象之前。我不知道为什么有时不会发生这种情况。这会导致内存泄漏。
  • 这个答案的第一句话是不正确的。当不再有对它的引用时,一个对象将被释放(不释放)。
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2021-12-09
  • 2012-10-10
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2016-12-28
相关资源
最近更新 更多