知人がはまっていたバグ。
@interface MyClass : NSObject { MyObj* p; } @property (retain) MyObj* p; @end @implementation MyClass @synthesize p; -(void)setp { p= value; // ← ここ ~ self.p= nil; } @end
ようするに Property と思って代入したのに “self.” が足りなかった
ため retain されていませんでした。
1. p= value; 2. self->p= value; 3. self.p= value;
どれもコンパイルが通りますが上の 2つはメンバへの直接アクセスで、
3. だけ property のメソッドが呼ばれます。
Xcode 4.4 以降はメンバの宣言も @synthesize も書かなくて良くなっています。
簡単に書けますし、この時デフォルトで挿入される変数も “_p” となるため、
上の 1. 2. のようなミスもエラーで分かります。
// Xcode 4.4 以降 @interface MyClass : NSObject @property (retain) MyObj* p; @end @implementation MyClass -(void)setp { self.p= value; ~ } @end
次からは絶対 ARC にするともいってました。