2010年9月4日土曜日

[Objective-C] リファレンスカウンタとの戦い

以前かいたObjective-Cのリファレンスカウンタについて,再び考える.

[Objective-C] 詳解 Objective-C 2.0 リファレンスカウンタ 不明なところ - トウヨウリンゴ
http://newringo.blogspot.com/2010/05/objective-c-objective-c-20.html

コードはこちら.

#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;
}

そして,今日わかったのは,詳解 Objective-C 2.0と同じ結果を得るためには,以下のコンパイルをすればよい.

gcc -framework Foundation -m32 reference.m

結果
init: 1
retain: 2
retain: 3
release: 2
release: 1
objc[2758]: FREED(id): message retainCount sent to freed object=0x103f60
Illegal instruction

ただ,このオプションで本通りになるというのは,なっとくいかない.

-m32のオプションなしの場合

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

64bit用では,同様の結果が得られないのは,なぜか.
さっぱりだ.

0 件のコメント:

コメントを投稿