我正试图抓住保留/释放。我知道他们是匹配的。但我不知道何时必须保留参考资料。
-(void)sampleMethod:(RandomClass *) obj {
[obj retain];
// Do stuff to object...
[obj release];
}
是否有必要保留(从而释放)obj?
我担心obj会离开。是否必须(如果)在函数中尽快保留参考参数?函数调用和函数的第一条指令之间的时间间隔怎么样?
谢谢!
答案 0 :(得分:5)
您不必担心传递的对象会消失,因此无需保留它。正确的内存管理*确保对象在方法的持续时间内存在,因为它将与调用者位于同一个线程中,因此该线程的自动释放池不应该被耗尽,并且调用者无法释放该对象,直到您的方法已经回来了。这甚至适用于诸如performSelectorInBackground之类的方法,因为它将保留参数。
* 正确的内存管理 - 这意味着每个使用自动释放对象的线程都会获得自己的自动释放池,该池在创建它的同一上下文中耗尽,并且正确保留通过线程传递的对象。
答案 1 :(得分:5)
简短回答;使用ARC。
乔的回答或多或少是正确的。直到它没有。
通常,不需要保留参数或从其他方法返回值。但是,生成的代码只能通过巧合和约定来实现,而不是通过算法分析。
考虑:
NSString *foo = [aMutableArray objectAtIndex: 5];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
你的代码崩溃了。也许(如果foo
发生成为常量字符串或发生以保留其他内容或发生它不会崩溃>在其他地方保留/自动释放。)
从技术上讲,应该是:
NSString *foo = [aMutableArray objectAtIndex: 5];
[foo retain];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
[foo release];
也就是说,foo
应该在进入范围时保留,并在范围内不再使用时释放。或者你可以[[foo retain] autorelease];
,但自动释放压力可能是一个问题(通常不是,但可能是)。
ARC会进行此类分析,并确保在必要时保留foo
,如上所示。