Googleスタイルガイドのプロパティ定義でアクセサを強制
Google Objective-Cスタイルガイド 日本語訳
↑こちらにあるプロパティ定義のガイドに添って実装すると、アクセサを通さないで直接代入してしまうコーディングミスを防げそうです。
@interface Foo : NSObject { @private NSArray *hoge_; } @property (nonatomic,retain) NSArray *hoge; -(id)initWithHoge:(NSArray *)hoge; @end @implementation Foo @synthesize hoge = hoge_; - (id)initWithHoge:(NSArray *)hoge { if (self = [super init]) { self.hoge = hoge; } return self; } - (void)dealloc { [hoge_ release]; [super dealloc]; } @end
この定義にすることで、
instance.hoge_ = [NSArray arrayWithObject:@"a",@"b",@"c",nil];
という代入ができなくなり、もれなくアクセサ経由の代入が強制されます。
ポイントは二つ!!
■ プロパティ名とインスタンス名
プロパティに対応するインスタンス変数名はアンダースコア(_)で終わらなければならない。 プロパティ名は、対応するインスタンス変数名から最後のアンダースコア(_)を取り除いたもの にするべきだ。
この場合、@synthesizeも適切に設定しなければならないので注意です。
@synthesize hoge = hoge_;
■ @privateなメンバ変数
メンバ変数は @private と宣言するべきだ。
インスタンス変数という言いかたとメンバ変数という言いかたがありますが、同じ意味です。
以上のオマジナイをするだけでうっとおしい不正なメモリアクセスによるエラーが回避できるなら、試してみる価値はあるんではないでしょうか。