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

看板MacDev作者 (zonble)時間14年前 (2010/10/14 18:30), 編輯推噓2(206)
留言8則, 3人參與, 最新討論串3/5 (看更多)
※ 引述《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

10/14 23:56, , 1F
學習學習
10/14 23:56, 1F

10/15 00:00, , 2F
Z大 我的那個該不會也是retain的問題吧 因為也是不能保
10/15 00:00, 2F

10/15 00:00, , 3F
留資料 所以是不是有造成retain cycle? 好煩惱@@
10/15 00:00, 3F

10/15 00:06, , 4F
Audio 那個問題嗎?應該不是,如果你沒 retain 到
10/15 00:06, 4F

10/15 00:06, , 5F
對非法指標操作的結果應該是 crash,而不是沒資料。
10/15 00:06, 5F

10/15 00:07, , 6F
沒資料的話,比較可能是對 nil 呼叫了 retain,但是 Audio
10/15 00:07, 6F

10/15 00:07, , 7F
本身比較麻煩,因為 Audio 是 realtime 的東西,我稍晚來
10/15 00:07, 7F

10/15 00:07, , 8F
幫你看一下好了,我也沒試過那個 Audio Capture Device。
10/15 00:07, 8F
文章代碼(AID): #1Cjjk_wy (MacDev)
討論串 (同標題文章)
文章代碼(AID): #1Cjjk_wy (MacDev)