我应该在每个方法中保留一个对象指针参数吗?

时间:2011-08-26 19:33:11

标签: objective-c ios retain

我正试图抓住保留/释放。我知道他们是匹配的。但我不知道何时必须保留参考资料。

-(void)sampleMethod:(RandomClass *) obj {
    [obj  retain];
    // Do stuff to object...
    [obj release];
}

是否有必要保留(从而释放)obj?

我担心obj会离开。是否必须(如果)在函数中尽快保留参考参数?函数调用和函数的第一条指令之间的时间间隔怎么样?

谢谢!

2 个答案:

答案 0 :(得分:5)

您不必担心传递的对象会消失,因此无需保留它。正确的内存管理*确保对象在方法的持续时间内存在,因为它将与调用者位于同一个线程中,因此该线程的自动释放池不应该被耗尽,并且调用者无法释放该对象,直到您的方法已经回来了。这甚至适用于诸如performSelectorInBackground之类的方法,因为它将保留参数。

* 正确的内存管理 - 这意味着每个使用自动释放对象的线程都会获得自己的自动释放池,该池在创建它的同一上下文中耗尽,并且正确保留通过线程传递的对象。

答案 1 :(得分:5)

简短回答;使用ARC。

乔的回答或多或少是正确的。直到它没有。

通常,不需要保留参数或从其他方法返回值。但是,生成的代码只能通过巧合和约定来实现,而不是通过算法分析。

考虑:

NSString *foo = [aMutableArray objectAtIndex: 5];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];

BOOM!

你的代码崩溃了。也许(如果foo 发生成为常量字符串或发生以保留其他内容或发生它不会崩溃>在其他地方保留/自动释放。)

从技术上讲,应该是:

NSString *foo = [aMutableArray objectAtIndex: 5];
[foo retain];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
[foo release];

也就是说,foo应该在进入范围时保留,并在范围内不再使用时释放。或者你可以[[foo retain] autorelease];,但自动释放压力可能是一个问题(通常不是,但可能是)。

ARC会进行此类分析,并确保在必要时保留foo,如上所示。