我有这样一些代码:为什么返回值不释放
- (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