2時間をかかったトラブルシューティングの裏

2時間をかかったトラブルシューティングはようやく一段落になった。JAVAプログラマーの目で見ると全然おかしくないソースにも関わらず、メモリリークの問題はどうしてもクリアできなかった。元々JAVAやC#みたいなハイレベルOO言語のプログラマーではのミスではないかと思う。
一つ目は、数列の定義。いままでNSArrayをArrayListの同等品と考えていましたので、下記のような書き方をしていたのだ。実は、@”a”, @”b”(=JAVAの”a”,”b”)のような数列にいれたいオブジェクトの後ろに、終止符みたいにnil(= JAVAのnull)を入れないといかないだ。
![]()
もう一つは、Objective-Cの特徴であるpropertyの使用方法です。@propertyと@synthesizeの利用で、JavaBeanの面倒なGetとSet方法がこれで自動生成されることになる。retainなどのキーワードを指定すれば、ある程度メモリ管理の手間も省くことになる。
だが、self.propertyName = anObjectとpropertyName = anObjectに、微妙な差があるんだ。
self.propertyNameの場合、[self setPropertyName anObject]と同等なので、@property (retain)を指定すれば、retainをやってくれるのが、 propertyName = anObjectはただの変数のアサインだけだ。下記のソースを見れば分かる。keyNamesがretainされることを前提に、一時変数array(ポインター)のreleaseを行っていた。
keyNames = arrayを書く場合、このメッソドが終わる時点に、keyNamesのメモリが解放されてしまうので、次にkeyNamesをアクセスするところから、エラーが出るだ。

※修正後のソース、緑色がついてるのは前述の2点注意です。
へたくそな説明を最後まで読んでくれる方はいるかが問題だが、一応メモにもなる。
できれば、setXXXを使うほうはいいと思っています
setXXXを使えば分かりやすいですね。
Appleのサンプルにはほとんどself.xxxの形で使っています。[a setXXX obj]のソースより書きやすいのは間違いないです(笑)。