知人がはまっていたバグ。
@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 にするともいってました。