2012年11月11日日曜日

インスタンスにnilを入れたら0が返るが参照カウント自体が0になる訳ではない

インスタンスなんかにnilを格納すると必ず0が返るのですが、その際、参照カウント自体が0になる訳ではありません。当たり前のことですがメモで。

0が返る、というよりはnilを格納するとアドレスからデータが消えると言ったほうがいいのかもしれません。

例1

まずはメモリを確保してアドレス値を出力してみます。
NSData *data = [[NSData alloc]init];  // (1)

[data retain];  // (2)

NSLog(@"%d", [data retainCount]);  // (3)

NSLog(@"%p", data);  // (4)

(1)で、alloc/initし参照カウント1。

(2)で、retainして参照カウント+1。

(3)では、参照カウント2が出力。

(4)で、アドレスの値を出力。今回は0x71646e0と出ました。

例2

次にnilを入れて参照カウントとアドレス値を見てみます。
NSData *data = [[NSData alloc]init];  // (1)

[data retain];  // (2)

NSLog(@"%d", [data retainCount]);  // (3)

NSLog(@"%p", data);  // (4)

data = nil;  // (5)
    
NSLog(@"%d", [data retainCount]);  // (6)
    
NSLog(@"%p", data);  // (7)

(5)〜(7)が追加した部分です。

(5)で、インスタンスにnilを格納。

(6)で、参照カウントを出力。ここで0が出力

(7)で、アドレス値を出力。0x0が出力

おわり

参照カウントがいくつのときでもnilを格納すると、retainCount自体は0になります。そして、nilを格納するとメモリからそのオブジェクトが消滅します。

また、nilを格納したインスタンスはいくらreleseしてもメモリリークはしないようです。もちろん参照カウントは0のままです。

0 件のコメント:

コメントを投稿