我有這樣一些代碼:爲什麼返回值不釋放
- (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方法被調用時(其不自動釋放之後釋放)。內存泄漏! 發佈事件何時發生?爲什麼釋放事件不會以相同的方法發生?
您返回的對象不受該代碼額外保留,因爲它已知由容器對象保留。如果您實際上查看了上面的跟蹤信息,則會看到第二個案例缺少GraphicsServices的發佈,這是上述代碼的外部。 – 2014-11-22 14:50:47
(我對GraphicsServices並不熟悉,但是你在某種程度上啓用了一個事件處理程序或者其他問題對象作爲它的「數據」值,如果這個事件處理程序從未被觸發或取消,你的對象仍然保留)。 – 2014-11-22 14:53:35