Hatena::Groupiphone-dev

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

ああああ
 | 

2008-08-15

release周りの処理

04:37 | release周りの処理 - f-shinの日記 を含むブックマーク はてなブックマーク - release周りの処理 - f-shinの日記 release周りの処理 - f-shinの日記 のブックマークコメント

releaseしなきゃいけないとき、してはいけない時が、よくわかってない。

この仕組みって、allocを使ってないようなオブジェクトは無視して良いのかな?

例えば、メソッド内で宣言されたNSStringとか。

(retainで参照カウンタを上げた場合はreleaseしなきゃいけないだろうけど。)


あるメソッド内から別のオブジェクトに渡す引数としてのNSStringを宣言したとして、

オブジェクトにもう渡したからと、同メソッド内でreleaseすると値が消滅してしまうらしく

エラーになってしまい、releaseを書かなければ、エラーにならない処理ってのがある。

(具体的に言うとUIWebViewのこと)

 

ってことは、そのメソッドが終わってからNSStringが利用されてるってことだよね。

 

ってことは、NSStringはメモリのどこかに存在するのだから、誰かが解放してあげなきゃ

いけないような気がするのだが、そいつは勝手に消滅してくれるのだろうか。。。

 

autoreleaseとかも気軽に書いちゃだめなのね。


うーむー。どうにも解せないなー。


----------------------------------

追記:

http://www.ne.jp/asahi/techno/ostra/ccj/CShObjCJava-memory.html

イベントが発生してプログラム中のコールバックに処理が渡ってきたときにNSAutoreleasePoolが自動的に有効になっている。Cocoaのクラスを普通に用意して使うと自動的にautorelease扱いになっており、処理がシステム側に戻るときにNSAutoreleasePoolの破棄が行なわれ、Cocoaのクラスのインスタンスも一緒に破棄される。

「そのメソッド」の中でautoreleaseを書くとエラーになることから、「そこから次に渡した実装が見えないメソッド」の中でautoreleaseされてることを信じるしかないってことなのかな。

deallocを監視するサブクラスを作って投げれば監視すれば良さそうな気がしてきたが、まぁ、そうしないと動かないだけなので、そう信じることとする(w

addObjectとか、どことなく親しみ深いメソッドを見ると

21:57 | addObjectとか、どことなく親しみ深いメソッドを見ると - f-shinの日記 を含むブックマーク はてなブックマーク - addObjectとか、どことなく親しみ深いメソッドを見ると - f-shinの日記 addObjectとか、どことなく親しみ深いメソッドを見ると - f-shinの日記 のブックマークコメント

ついつい、

mutableArray.addObject(btn);

とか書いてしまい、エラーから抜け出せなくなる初心者です。

正解は、

[mutableArray addObject:btn];

どえす。

faultierfaultier2008/11/02 23:43autoreleaseが呼ばれてるのは、"「そこから次に渡した実装が見えないメソッド」の中"じゃなくて、
値が返ってくる前です。例えばNSStringだったら、[NSString string]のstringメソッドの中。
で、NSAutoreleasePoolも用意してないのにどこにあるんだろ、って言うと、実際に自分が書いた部分に処理が来るより前に用意されて、終わった後に破棄されてます。
順番で言うと、
・イベント起きる
・NSAutoreleasePool作られる
・自分の書いた部分に処理が来る
・NSStringのstringメソッド呼ぶ
・autorelease済みのNSStringオブジェクトが返される
・続きの処理をする
・NSAutoreleasePoolが破棄されて、そんとき一緒にNSStringのオブジェクトも消える
・イベント終わる
トラバ飛んでると思いますが、http://blog.livedoor.jp/faulist/archives/1051536.htmlにそれに絡んだ話も書いてますんで、良かったら見てみて下さい。

 |