インスタンス変数へのポインタの解放

インスタンス変数をポインタへ格納したら、そのポインタって解放しちゃいけなんですね〜。ポインタ解放後にインスタンス変数へアクセスすると落ちるというのに気づかず、今回もどっぷりハマりました。。
ていうか要するにポインタ、ってまだぜんぜんよくわかってないんだよね。

そしてややこしいのが、インスタンス変数に格納したポインタは、格納後にリリースしてももちろん問題ないんですね。。これは普通にやるもんね。


はぁ〜、C言語、勉強しないと。。


追記 9/15
これってC言語、というより、ObjectiveC特有のretainCountによる問題ですよね。「インスタンス変数に格納したポインタは、格納後にリリースしてももちろん問題ない」と書きましたが正確でなかったです。インスタンス変数への代入も、そのままhoge = piyo;と代入するのと、self.hoge = piyo;と、アクセサメソッドを利用して代入するのとではretainCountが変わってきます。

hogeインスタンス変数、piyoのretainCountが1の場合、

hoge = piyo; //retainCount=1
self.hoge = piyo; //retainCount=2

なので、1行目の記述でhogeへpiyoを代入した場合、代入後にpiyoをreleaseしてしまうと、retainCountが0になりdeallocされます。つまり、その後hogeへのアクセスが生じるとエラーが起こるわけです。

アクセサの定義時に(nonatmic, retain)と機械的に書いていましたが、このretainはセッターメソッド経由時にretainしますよってことなんですね〜。