objective-cのプロパティとインスタンス変数

autoreleaseを使っていたらハマったので、調査したことをメモ

 

・ハマったときの状況

クラスAのプロパティとしてクラスBのインスタンスをもつ

クラスBのinitにてインスタンス変数に対してメモリを確保

 bArray = [NSMutableArray array];

その後の処理中にbArrayに対してアクセスするとbad accessで落ちる

 

最終的にとった解決方法はbArrayのメモリ確保にautoreleaseを使わないようにしただけ。

 

ただ、これを解決する途中にプロパティへのアクセスとインスタンス変数へのアクセスの違いが見られたのでその辺りを調査

起こったこととしては

bArrayへのメモリ確保時に

 _bArray = [NSMutableArray array]; 

としたときはautoreleaseにより予期せぬ解放が起こるが、

 self.bArray = [NSMutableArray array];

としたときはそれが起こらなかった。

 

この理由を調べるために見たもの

https://developer.apple.com/jp/devcenter/ios/library/documentation/ProgrammingWithObjectiveC.pdf

→47ページくらい

 

わかったこと

・プロパティ経由でアクセスするとアクセッサメソッドを経由する

・プロパティはインスタンス変数を使って実装されている

 

上記の現象が起こった理由の推測

・デフォルトのアクセッサメソッドの処理中に参照が生成されているのでは?

 →プロパティは外からアクセスするためのものという性質のため

 

根本的な原因はまだ不明

 

副次的に得た知識

インスタンスメソッドの処理内で自身のメンバにアクセスするときでもself.を使ってアクセッサメソッド経由でアクセスする方がよい

・ただし、alloc, deallocなどself自体が完全に定義されていない可能性があるときはインスタンス変数へ直接アクセスすべき