@property(nonatomic, retain)したときに .(ドット)による代入を使うかどうかについて

はじめに

@property(nonatomic, retain)

を使った場合、問答無用でretain(+1)されるのだ。
おぉ 僕らはどうしたらよいのだろう。


この問題に関して、場合わけを行い、どんなプログラムの書き方(作法)があるのかを考える。

前提条件

deallocでreleaseしている

ちなみに前提として、deallocで
インスタンス変数をreleaseする形をとっているものとする。

今回使うインスタンス変数の名前

今回つかうインスタンス変数の名前は、
NSArrayのものは arr
NSStringのものは str
とする。

initを代入する場合

initとメソッドについているのはretain(+1)されている証!
これをドットでアクセスさせてしまえば二重にretainされてしまい(+2)になってしまう
どうしよう................

あえてドットを使って辻褄を合わせるためにreleaseする
NSArray *a = [[NSArray alloc] init];
self. arr = a;
[a release];
ドット使わない
arr = [[NSArray alloc] init];

文字列リテラルを代入する場合

あえてドットを使って辻褄を合わせるためにreleaseする
NSString *s = @"AAA";
self.str  = s;
[s release];
そもそも@property(nonatomic, retain)を使わない

文字列を扱うときはコピーだ。
ということでNSString型のインスタンス変数の @propertyはコピーで宣言しておく。

@property(nonatomic, copy)

autoreleaseを代入する場合

普通にドットで代入するだけ
self.str = [NSString stringWithFormat:@"%@", @"AAA"];
なんども言うように@property(nonatomic, retain)を使わない

やはり!文字列を扱うときはコピーなんだ!!
ということでNSString型のインスタンス変数の @propertyはコピーで宣言しておく。

@property(nonatomic, copy)

最後に

こう書いたものの.........

もっと うまい説明がある気がする。

辻褄を合わせるという表現も、
オーナーシップの考えかたすれば、
当然といえば当然な気もする.......