Hatena::Groupiphone-dev

f-shinの日記 このページをアンテナに追加 RSSフィード

ああああ
 | 

2008-11-02

releaseの使いどころ。メモリの辺りがどうしてもわからない。

14:31 | releaseの使いどころ。メモリの辺りがどうしてもわからない。 - f-shinの日記 を含むブックマーク はてなブックマーク - releaseの使いどころ。メモリの辺りがどうしてもわからない。 - f-shinの日記 releaseの使いどころ。メモリの辺りがどうしてもわからない。 - f-shinの日記 のブックマークコメント

initを使ってリリースした変数は解放せねばならないということはわかる。

でも、解放しどころが悪いとアプリが落ちる。早すぎるってことか。

既に確保されているハズの変数を二度initするのはメモリリークだよね?

解放されている変数は、

if (obj == nil) では判別できないのだろうか。

ボタン押下時などに、同じロジックを走ることが多くて、何度もinitをしてしまうことが多いのだが。。。。



もう一個よくわからないのが、ローカル変数として使ったinitで確保してないNSStringは解放しなくて良いのだろうか。

特定のオブジェクト戻り値がNSStringである場合。クラスの中でNSStringがinitされて参照が戻されているケース。


また更に外部のobjectに渡すと、構わずreleaseするとアプリが落ちたりするので解放できなくなったりして、

解放するタイミングを失うのだが、そんなもん?!



アプリが、やたら落ちるのを探していくと、大体、このreleaseにまつわるミスのケースが多い。

こういうものはautorelease poolを使うべきなのか、特に気にする必要はないのか、(別においらは、init使ってないし)

その辺の勘所がよくわからん。

ktakayamaktakayama2008/11/02 21:04そのメソッドやクラス内でそのオブジェクトが必要かどうかがキモです。
適当に release や retain を使ってると、わけわかんない事になります。
release は別にメモリの開放じゃなくて、参照カウンタを下げているだけなので、クラスの中で init をしているなら、そのクラスが責任を持って release しておけば問題ないです。

「何度もinit」に関しては、具体的なコードを見ないと判断出来ないですが、オブジェクトが必要なくなったタイミングで release するよう心がけていれば、そんなに悩む必要はないはずです。

自分の場合、この辺の話はたのしい本が大変参考になりました。

yamionpyamionp2008/11/03 14:42詳解 Objective-C 2.0 で参照カウンタの章があって詳しく解説されてるのでおすすめです。@""でコード中に埋め込まれたNSStringはアプリ終了まで存在するそうですよ。

f-shinf-shin2008/11/03 15:40>ktakayama
なるほど。あれは参照カウンタを下げてるだけなんですね。
ということは、何かの拍子に開放されてしまって、その後に不都合が起きるから、遅れてアクセス違反エラーになるんですね。

問題は、WebViewとかカメラなどの組み込みクラスに渡した変数がいつどこまで必要なのかがわからないって辺りなのかもしれません。

>yamionp
アプリ終了時にautoreleaseでリリースされてるってことなのかな。本をちゃんと読んでみます!

fladdictfladdict2008/11/04 13:13alloc & init で作成したオブジェクトは retain されるので手動でreleaseする必要があります。
[NSString stringWithFormat:○○] みたいに alloc しないで作成されるオブジェクトは、変数名がcreateかcopyかnewではじまらない限り、autorelease がついていてイベントの終了時とかに自動で開放されるみたいです。

fladdictfladdict2008/11/04 13:14×変数名がcreateかcopyかnewではじまらない限り
○関数名が

 |