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

DrF*_*yd5 3 objective-c retain ios

我试图获得保留/释放的悬念.我知道他们是匹配的.但我不知道何时必须保留参考文献.

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

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

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

谢谢!

Joe*_*Joe 5

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

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


bbu*_*bum 5

简短的回答; 使用ARC.

乔的回答或多或少是正确的.直到它不是.

通常,不需要保留参数或从其他方法返回值.但是,生成的代码只能按巧合和惯例工作,而不能通过算法分析.

考虑:

NSString *foo = [aMutableArray objectAtIndex: 5];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
Run Code Online (Sandbox Code Playgroud)

繁荣!

你的代码崩溃了.也许(如果foo 恰好是一个常量字符串,或者恰好被其他东西保留或者碰巧在其他地方保留/自动释放,它不会崩溃).

从技术上讲,应该是:

NSString *foo = [aMutableArray objectAtIndex: 5];
[foo retain];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
[foo release];
Run Code Online (Sandbox Code Playgroud)

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

ARC进行这种分析,并确保foo在必要时保留如上所示.