Re: [問題] 什麼時候該retain呢

看板MacDev作者 (肉元,吉米,助教)時間14年前 (2010/10/14 22:33), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/5 (看更多)
※ 引述《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)
文章代碼(AID): #1CjnIeuf (MacDev)
討論串 (同標題文章)
文章代碼(AID): #1CjnIeuf (MacDev)