2012年5月17日木曜日

self忘れの罠

synthesizeでプロパティを自動生成した時、デフォルトではメンバ変数名はプロパティと同名になる。

retain属性のプロパティhogeをsynthesizeした際に、

hoge = [NSMutableArray array];

としてしまうと、メンバ変数への直接代入になってretainされず、autoreleaseされた配列にアクセスすることでクラッシュする。

self.hoge = [NSMutableArray array];

と書かなければならない。

なにこの罠。


synthesizeで自動生成するときは、_hogeというインスタンス変数を明示的に指定するべき」という話は見た記憶があるんだけど、その理由として「メソッドの引数にhogeという名前を使用しても名前が競合しない」みたいな眠い理由が書いてあったので、どうでもいいやと思って書かなかったけど、「プロパティの属性に指定した挙動がself書き忘れで変化してしまう」と踏まえるとやっぱり書くべきなんだろうな。

_hogeってインスタンス変数規則が生理的に受け付けない、とかどうでもいい理由だし、今後はちゃんと書くようにしようかな…。