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

GadgetIt — デバッガ.png

2時間をかかったトラブルシューティングはようやく一段落になった。JAVAプログラマーの目で見ると全然おかしくないソースにも関わらず、メモリリークの問題はどうしてもクリアできなかった。元々JAVAやC#みたいなハイレベルOO言語のプログラマーではのミスではないかと思う。

一つ目は、数列の定義。いままでNSArrayをArrayListの同等品と考えていましたので、下記のような書き方をしていたのだ。実は、@”a”, @”b”(=JAVAの”a”,”b”)のような数列にいれたいオブジェクトの後ろに、終止符みたいにnil(= JAVAのnull)を入れないといかないだ。
DetailViewController.m — GadgetIt-2-2.png

もう一つは、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をアクセスするところから、エラーが出るだ。

DetailViewController.m — GadgetIt-4.png
※修正後のソース、緑色がついてるのは前述の2点注意です。

へたくそな説明を最後まで読んでくれる方はいるかが問題だが、一応メモにもなる。

  • トラックバック 停止中
  • コメント (2)
    • BaoTuo
    • 2008年 8月 12日

    できれば、setXXXを使うほうはいいと思っています

    • R.J.
    • 2008年 8月 12日

    setXXXを使えば分かりやすいですね。
    Appleのサンプルにはほとんどself.xxxの形で使っています。[a setXXX obj]のソースより書きやすいのは間違いないです(笑)。