看板 MacDev 關於我們 聯絡資訊
今天在寫iPhone程式時,出現一個奇怪的Bug,執行到一半就會當機。 找了很久發現問題出在retain count。 因為retain count變為0,東西被dealloc了。接下來取用就會出問題。 但我不曉得為什麼這樣retain count會變為0,跟大家討論一下。 以下只取用重點部分: 在.h中 ... NSMutableArray *currentStroke; .... @property (nonatomic, retain) NSMutableArray *currentStroke; 在.m中 @synthesize currentStroke; NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:20]; NSLog(@"mutable array retain count1 = %d", [mutableArray retainCount]); currentStroke = mutableArray; NSLog(@"mutable array retain count2 = %d", [mutableArray retainCount]); NSLog(@"currentStroke retain count1 = %d", [currentStroke retainCount]); [currentStroke retain]; NSLog(@"currentStroke retain count2 = %d", [currentStroke retainCount]); 跑出來的結果 2009-12-26 21:52:38.950 [17246:207] mutable array retain count1 = 1 2009-12-26 21:52:38.951 [17246:207] mutable array retain count2 = 1 2009-12-26 21:52:38.951 [17246:207] currentStroke retain count1 = 1 2009-12-26 21:52:38.952 [17246:207] currentStroke retain count2 = 2 我的想法是 mutable array retain count1是1沒錯,但mutable array retain count2應該 為2,因為currentStroke的Setter會先release舊的(沒有東西),再retain新的 (mutableArray),這時為1+1=2. 後面的retain只是想確定用NSLog輸出的東西 正確。 請問我的想法哪裡錯了呢? 我是用Simulator - 3.1.2 | Debug. 謝謝! -- ▂▃▄▃▂ ◢ ˙ ˙ ▉▃ /喵喵~~~~ ◣╲ˍ ╱▎ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.126.4.1
Blueshiva:currentStroke = mutableArray;只是指定變數,沒有改變 12/26 22:15
Blueshiva:retain count,照你描述的,你應該要用 12/26 22:15
Blueshiva:[self setCurrentStroke:mutableArray]; 或者 12/26 22:16
Blueshiva:self.currentStroke = mutableArray; 才會呼叫到setter 12/26 22:16
denru01:嗯嗯 原來是少加了self 12/27 00:06
denru01:感謝! 12/27 00:06
leondemon:難怪u大很討厭dot operator... XD 12/27 00:48