我有一些代码:
- (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 :(得分:2)
当没有对象的引用时,将释放该对象。但是,返回的对象仍然由数组sendArray
强烈保留。一旦它离开该集合,它将被释放。
所有类型的集合,NSArrays,NSSets和NSDictionaries都会强烈引用您添加的对象,这意味着它们将会“生存”#34;在阵列的生命周期内。