2010年5月17日月曜日

[Objective-C] 詳解 Objective-C 2.0 リファレンスカウンタ 不明なところ

先日,萩原さんの詳解 Objective-C 2.0 リファレンスカウンタのプログラムを実行してみたら,出力結果が予想と異なるものであったので,現在も困っています.

困っているのは,以下のコードです.
#import <Foundation/Foundation.h>
#import <stdio.h>

int main(void)
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
  NSObject *obj = [[NSObject alloc] init];
  printf("init: %d\n",[obj retainCount]);
  [obj retain];
  printf("retain: %d\n",[obj retainCount]);
  [obj retain];
  printf("retain: %d\n",[obj retainCount]);

  [obj release];
  printf("release: %d\n",[obj retainCount]);
  [obj release];
  printf("release: %d\n",[obj retainCount]);
  [obj release];
  /* 実行するとエラーになるはずなのだが・・・ */
  printf("release: %d\n",[obj retainCount]); 

  [pool drain];

  return 0;
}


コンパイル  gcc -framework Foundation reference.m
環境 os 10.6.2

出力結果
init: 1
retain: 2
retain: 3
release: 2
release: 1
release: 1


obj にreleaseメッセージを3回送ったあとに,参照カウンタを見ようとしたらエラーになるはずですが,参照カウンタが1と表示されてしまいます.
何故なんでしょうか.



0 件のコメント:

コメントを投稿