作者Gsus (肉元,吉米,助教)
看板MacDev
标题Re: [问题] 什麽时候该retain呢
时间Thu Oct 14 22:33:09 2010
※ 引述《zonble (zonble)》之铭言:
: ※ 引述《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 传入的物件了。
这部分我讲错了QQ
我重新讲一次XD~
比如说我有一个自己写的ClassA, ClassA中有个 +(NSString *) methodA;
我在某个物件中call NSString *str = [ClassA methodA];
那
methodA中回传的string如果是下列方式产生的
return [NSString stringWithString:@"string"];
於是乎就产生了疑问....
究竟像这样return一个会被autorelease pool autorelease的物件时,
难道接他的人不需要做retain吗?
还是说其实我在return前应该要先做好retain再return?
: : 4. IBAction, 有时候会把sender也传过来, 这种情况下也要retain sender吗?
: 如果是一个 view controller 中用 target/action,sender 通常是
: view controller 的 view,因为 view 已经被 view controller
: retain 一份了,所以没有再 release 的必要。
补一个问题
- (void)anyMethod {
NSArray *myArray = [NSArray arrayWithObject:@"anything"];
[NSThread detachNewthreadSelector:@selector(otherMethod:)
toTarget:self
withObject:myArray];
}
像这种状况,我的otherMethod应该要retain myArray对吧~?
其他的部份我了解了~
感谢感恩zonble大!!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.251.147.12
※ 编辑: Gsus 来自: 111.251.147.12 (10/14 22:42)
※ 编辑: Gsus 来自: 111.251.147.12 (10/14 22:53)
※ 编辑: Gsus 来自: 111.251.147.12 (10/14 23:11)