【发布时间】:2015-01-20 13:42:00
【问题描述】:
我有一些类似的代码:
- (SendFileInfo *)sendFileInfoForName:(NSString *)name {
for (SendFileInfo *sendFileInfo in sendArray)
{
if ([sendFileInfo.name isEqualToString:name])
{
return sendFileInfo;
}
}
return nil;
}
所以这个方法的返回值会是autorelease。我用instruments来跟踪SendFileInfo的retain/release事件;有时候SendFileInfo会在autorelease后释放,就像:
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 发布的版本,该版本在上述代码之外。
-
(我不熟悉 GraphicsServices,但您以某种方式启用了一个事件处理程序或诸如此类的问题对象作为它的“数据”值。如果该事件处理程序从未被触发或取消您的对象仍然保留。)
标签: ios objective-c memory-management autorelease