作者denru01 (阿儒)
看板MacDev
標題[討論] retain count值
時間Sat Dec 26 21:57:42 2009
今天在寫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
1F:推 Blueshiva:currentStroke = mutableArray;只是指定變數,沒有改變 12/26 22:15
2F:→ Blueshiva:retain count,照你描述的,你應該要用 12/26 22:15
3F:→ Blueshiva:[self setCurrentStroke:mutableArray]; 或者 12/26 22:16
4F:→ Blueshiva:self.currentStroke = mutableArray; 才會呼叫到setter 12/26 22:16
5F:→ denru01:嗯嗯 原來是少加了self 12/27 00:06
6F:→ denru01:感謝! 12/27 00:06
7F:→ leondemon:難怪u大很討厭dot operator... XD 12/27 00:48