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会离开.是否必须(如果)在函数中尽快保留参考参数?函数调用和函数的第一条指令之间的时间间隔怎么样?
谢谢!
您不必担心传递的对象会消失,因此无需保留它.正确的内存管理*确保对象在方法的持续时间内存在,因为它将与调用者位于同一个线程中,因此该线程的自动释放池不应该被耗尽,并且调用者不能释放该对象,直到您的方法已经回来了.这甚至适用于诸如performSelectorInBackground之类的方法,因为这将保留参数.
*正确的内存管理 - 这意味着每个使用自动释放对象的线程都会获得自己的自动释放池,该池在创建它的同一上下文中耗尽,并且正确保留通过线程传递的对象.
简短的回答; 使用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
在必要时保留如上所示.
归档时间: |
|
查看次数: |
1097 次 |
最近记录: |