retainCountの不思議
こんなコードをシミュレータで実行してみた。
cellはUITableViewCellのインスタンスだと思いねぇ。
NSLog(@"(1)cell.textLabel.text:%d", [cell.textLabel.text retainCount]);
NSString *title = [[NSString alloc] initWithFormat:@"%@", aPage.title];
NSLog(@"(2)title:%d", [title retainCount]);
cell.textLabel.text = title;
NSLog(@"(3)cell.textLabel.text:%d", [cell.textLabel.text retainCount]);
[title release];
NSLog(@"(4)title:%d", [title retainCount]);
NSLog(@"(4)cell.textLabel.text:%d", [cell.textLabel.text retainCount]);
で、これが結果
(1)cell.textLabel.text:0
(2)title:1
(3)cell.textLabel.text:3
(4)title:2
(4)cell.textLabel.text:3
(3)のところおかしくない? なぜ3なんだろう。
retainCountが1のtitleをcell.textLabel.textに突っ込んだら、retainされて2になりそうなもんなんだけど。
そして、(4)では直前に [title retainCount]); ってしてるのに、retainCountが減っていない。
これってどうしてだろう。
なんか納得できなくて気持ち悪い......。
うーん、うーん。
投稿者 CHEEBOW : 2010年10月21日 14:52
Tweet
[ Development ]
【お知らせ】音楽に関することはこちらのブログで書いています。くじら音楽部::BLOG
トラックバック
このエントリーのトラックバックURL:
コメント:
おそらく cell.textLabel.text の getter が retain & autorelease しているからだと思われます。
.text の Getter で retain & autorelease しないと、以下のコードを実行した場合にクラッシュします
NSString *title = [[NSString alloc] initWithFormat:@"%@", aPage.title];
cell.textLabel.text = title;
[title release];
// tempTitle の retainCount が 1
NSString *tempTitle = cell.textLabel.text;
// tempTitle がリリースされてしまう
cell.textLabel.text = nil;
// クラッシュ
NSLog(@"%@", tempTitle);
投稿者 aki_null : 2010年10月21日 15:12
>aki_null
ありがとうございます!
なるほど、getterがやっているんですねー。
てっきり、プロパティの代入でretainされるだけだと思っていました。
たしかに、retain & autoreleaseが必要になるわけですねー。
納得しました。すっきりです!
投稿者 CHEEBOW : 2010年10月21日 15:21