为什么返回值不会释放

时间:2014-11-22 13:19:26

标签: ios objective-c memory-management autorelease

我有一些代码:

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

因此,此方法的返回值将是autorelease.I使用工具来跟踪SendFileInfo的保留/释放事件;有时SendFileInfo将在自动释放后释放,就像:

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方法的时间(自动释放后不释放)。内存泄漏! 发布事件何时发生?为什么发布事件不会以同一方法发生?

1 个答案:

答案 0 :(得分:2)

当没有对象的引用时,将释放该对象。但是,返回的对象仍然由数组sendArray强烈保留。一旦它离开该集合,它将被释放。

所有类型的集合,NSArrays,NSSets和NSDictionaries都会强烈引用您添加的对象,这意味着它们将会“生存”#34;在阵列的生命周期内。