作者zonble (zonble)
看板MacDev
标题Re: [问题] 什麽时候该retain呢
时间Thu Oct 14 18:30:20 2010
※ 引述《Gsus (肉元,吉米,助教)》之铭言:
: 虽然说这似乎是很common的问题
: 但是我还是觉得应该问一下:
: 如果物件A在传someObject给物件B (ex: initWithSomething:(id)someObject)
: "通常"我们会在物件B中retain someObject
原则是这样:
1. 如果是成员变数,就 retain,在这个物件 dealloc 的时候,
release 所有的成员变数。
2. 只要不是用 alloc、init 产生的物件,像是用 Class method
产生的,如 [NSMutableData data],都是 autorelease 物件
3. 不要 retain delegate
所以,你在物件 B 里头 retain,很有可能是因为透过 setter
设定 B 的成员变数,因为是成员变数,所以 retain 一份。如果
用完就不用了,看是要直接 release,还是设定成 autorelease,
在下一轮 run loop 的时候放掉。
: 但是如果是在以下状况下,不知道是否也是一样会要retain呢?
: (以下状况someObject都是一个local ivar)
: 1. 在同一物件中,methodA call [self methodBWithSomeObject:someObject];
: methodB中需要retain someObject吗?
: 2. 在同一/不同物件中, 用
: [xxx performSelector:@selector(methodB) withObject:someObject];
: methodB中需要retain someObject吗?
这种状况主要要考虑的是 multithread 的问题,也就是,当你的
methodB 在使用传进来的物件的时候,会不会同时有其他的 thread
再另一头,把你正在用的物件给 release 掉。
如果没有其他的 Thread,状况就如上述,要变成成员变数的物件
就 retain,用完一次就没用的东西就不用。
Multithread 的状况可能像这样:
- (void)methodB:(id)inObj
{
// 另外一个 Thread 如果在执行到这边的时候 release 了 inObj
// 就会产生 Bad Access exception
[inObj doSomething];
}
有的时候就可能这样写:
- (void)methodB:(id)inObj
{
[inObj retain];
[inObj doSomething];
[inObj autorelease];
}
: 3. 传someObject给某个class method, class method中需要retain someObject吗?
这要看你的 class 有什麽地方会 release 传入的物件了。
: 4. IBAction, 有时候会把sender也传过来, 这种情况下也要retain sender吗?
如果是一个 view controller 中用 target/action,sender 通常是
view controller 的 view,因为 view 已经被 view controller
retain 一份了,所以没有再 release 的必要。
--
zonble.net
cocoa.zonble.net
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.103.143
1F:推 sinread:学习学习 10/14 23:56
2F:推 ryanliang:Z大 我的那个该不会也是retain的问题吧 因为也是不能保 10/15 00:00
3F:→ ryanliang:留资料 所以是不是有造成retain cycle? 好烦恼@@ 10/15 00:00
4F:→ zonble:Audio 那个问题吗?应该不是,如果你没 retain 到 10/15 00:06
5F:→ zonble:对非法指标操作的结果应该是 crash,而不是没资料。 10/15 00:06
6F:→ zonble:没资料的话,比较可能是对 nil 呼叫了 retain,但是 Audio 10/15 00:07
7F:→ zonble:本身比较麻烦,因为 Audio 是 realtime 的东西,我稍晚来 10/15 00:07
8F:→ zonble:帮你看一下好了,我也没试过那个 Audio Capture Device。 10/15 00:07