Xcode 4.4 と Objective-C property

知人がはまっていたバグ。

@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 にするともいってました。