initを使ってリリースした変数は解放せねばならないということはわかる。
でも、解放しどころが悪いとアプリが落ちる。早すぎるってことか。
既に確保されているハズの変数を二度initするのはメモリリークだよね?
解放されている変数は、
if (obj == nil) では判別できないのだろうか。
ボタン押下時などに、同じロジックを走ることが多くて、何度もinitをしてしまうことが多いのだが。。。。
もう一個よくわからないのが、ローカル変数として使ったinitで確保してないNSStringは解放しなくて良いのだろうか。
特定のオブジェクトの戻り値がNSStringである場合。クラスの中でNSStringがinitされて参照が戻されているケース。
また更に外部のobjectに渡すと、構わずreleaseするとアプリが落ちたりするので解放できなくなったりして、
解放するタイミングを失うのだが、そんなもん?!
アプリが、やたら落ちるのを探していくと、大体、このreleaseにまつわるミスのケースが多い。
こういうものはautorelease poolを使うべきなのか、特に気にする必要はないのか、(別においらは、init使ってないし)
その辺の勘所がよくわからん。
適当に release や retain を使ってると、わけわかんない事になります。
release は別にメモリの開放じゃなくて、参照カウンタを下げているだけなので、クラスの中で init をしているなら、そのクラスが責任を持って release しておけば問題ないです。
「何度もinit」に関しては、具体的なコードを見ないと判断出来ないですが、オブジェクトが必要なくなったタイミングで release するよう心がけていれば、そんなに悩む必要はないはずです。
自分の場合、この辺の話はたのしい本が大変参考になりました。
なるほど。あれは参照カウンタを下げてるだけなんですね。
ということは、何かの拍子に開放されてしまって、その後に不都合が起きるから、遅れてアクセス違反エラーになるんですね。
問題は、WebViewとかカメラなどの組み込みクラスに渡した変数がいつどこまで必要なのかがわからないって辺りなのかもしれません。
>yamionp
アプリ終了時にautoreleaseでリリースされてるってことなのかな。本をちゃんと読んでみます!
[NSString stringWithFormat:○○] みたいに alloc しないで作成されるオブジェクトは、変数名がcreateかcopyかnewではじまらない限り、autorelease がついていてイベントの終了時とかに自動で開放されるみたいです。
○関数名が