« Facebookが楽しいんです | メイン | iOS SDKのviewDidUnloadでoutletを解放するべきか否か »

2010年10月21日

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 このエントリーを含むはてなブックマーク

[ 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

コメントしてください




保存しますか?