2014-11-22 48 views
-1

我有这样一些代码:为什么返回值不释放

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

+0

您返回的对象不受该代码额外保留,因为它已知由容器对象保留。如果您实际上查看了上面的跟踪信息,则会看到第二个案例缺少GraphicsServices的发布,这是上述代码的外部。 – 2014-11-22 14:50:47

+0

(我对GraphicsServices并不熟悉,但是你在某种程度上启用了一个事件处理程序或者其他问题对象作为它的“数据”值,如果这个事件处理程序从未被触发或取消,你的对象仍然保留)。 – 2014-11-22 14:53:35

回答

2

当没有更多引用时会释放一个对象。但是,返回的对象仍然受到数组sendArray的强力保留。只要它离开那个集合,它就会被释放。

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

+0

我知道这一点。我非常肯定这个物品已经从集合中删除了。这个事件 - >(Release -1 4 00:48.155.558 GraphicsServices GSEventRunModal)发生在对象从集合中移除之前发生。我无法弄清楚为什么有时不会发生这种情况。而这会导致内存泄漏。 – Cotin 2014-11-22 13:37:08

+1

此答案的第一句话是不正确的。当没有更多引用时,对象将被释放(不释放)。 – rmaddy 2014-11-22 16:26:51