2014-11-22 51 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