@property(nonatomic, retain)したときに .(ドット)による代入を使うかどうかについて
はじめに
@property(nonatomic, retain)
を使った場合、問答無用でretain(+1)されるのだ。
おぉ 僕らはどうしたらよいのだろう。
この問題に関して、場合わけを行い、どんなプログラムの書き方(作法)があるのかを考える。
前提条件
deallocでreleaseしている
ちなみに前提として、deallocで
インスタンス変数をreleaseする形をとっているものとする。
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)
最後に
こう書いたものの.........
もっと うまい説明がある気がする。
辻褄を合わせるという表現も、
オーナーシップの考えかたすれば、
当然といえば当然な気もする.......