2009-10-07 6 views
7

各iPhoneアプリにはたくさんのオブジェクトがあり、アプリが死ぬまで永遠に生きていきます。それらは、アプリケーションデリゲート、ウィンドウ、メインビューコントローラ、ナビゲーションまたはタブコントローラ、それらのすべてのオブジェクトです。なぜ地球上で貴重なCPUサイクルを使い切る直前にそれらを放つべきですか?私の知る限り、アプリのプロセスは終了するので、ヒープ、一貫性、またはそれもなくなります。アプリケーションを終了する直前にオブジェクトを解放し(したがってオブジェクトを解放する必要があるのはなぜですか?

なぜ私はそれらをリリースする必要がありますか? Appleのデベロッパーマニュアルは、コードサンプルの後ろに(iPhone Development Guideから)好きだと主張しています。それは私が単語で検索した最初の場所ですdeallocNHObject-dealloc方法に関する議論部から

@implementation HelloWorldAppDelegate 
@synthesize window; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    // Override point for customization after app launch 
    MyView *view = [[MyView alloc] initWithFrame:[window frame]]; 
    [window addSubview:view]; 
    [view release]; 
    [window makeKeyAndVisible]; 
} 
- (void)dealloc { 
    [window release]; 
    [super dealloc]; 
} 
@end 

注アプリケーションが終了するときに、プロセスのメモリを自動的にクリアされるのでが出口が多いのdeallocメッセージが送信されない可能性のあるオブジェクトすべてのメモリ管理方法を呼び出すよりもオペレーティングシステムがリソースをクリーンアップできるようにするだけで効率的です。このおよびその他の理由により、あなたは

しかしのdeallocのdeallocで希少な資源を管理するべきではありません、アプリケーションが15秒以内にapplicationWillTerminateに反応するのに十分な速さであれば、試料中の方法は、上記の現在の実装で呼び出されます。

もう一度。上記のdeallocメソッドをapp exitスピードで書くのは避けるべきですか?そうしたアプローチに問題はありますか?

+1

Appleのマニュアルはどこにありますか?私は一度に大部分のドキュメントを読んだことがありますが、実際には、いくつかの場所で逆のことを思い出しています。 – Chuck

+0

Appleは、終了時にこれらのクラスのいくつかでdealloc呼び出しを受け取るという保証はありません。したがって、deallocルーチンに保存するコードを配置することは悪いことです。 – mahboudz

+0

なぜそれらのためにdeallocコードを書くのは大変ですか? –

答えて

0

リリースされるクラスには、deallocメソッドまたはそのスーパークラスの1つに状態を保存するなどの副作用がある可能性があるためです。 OSは気にする必要はありません。何に関係なくすべてのリソースを取り戻す必要があります。

+0

deallocで状態を保存していますか?どうして? –

+5

deallocに状態を保存することは、deallocの実行が保証されていないため、非常に悪い考えです。 applicationWillTerminateは状態を保存するために用意されています。 – mmc

+0

*あなたがそれを行うクラスを持っているなら、ええ、終了する前に解放する必要があります。しかし、Appleの文書はできるだけ避けるように言います。なぜなら、オブジェクトは一般に終了時に解放されることを意図していないからです。 – Chuck

3

もっともな理由は再利用です。ある場所から別の場所にオブジェクトを移動したり、目的を変更したりする可能性があります。あなたがそれをするなら、あなたのすべてが点在していることを確かめることが最善です。

これはちょうど良い習慣です。あなたがそこでそれをすることを覚えているなら、あなたはどこでもそれをやるでしょう。

+1

はい、私にとっては、駐車場を通って運転しているときにターンシグナルを使用するようなものです。これは必ずしも必要ではありませんが、この習慣を身につけるのは良いことです。 –

+0

あなたは人間ではありません。それを考えずに機械的に同じことを何度も繰り返すことは、あなたの脳を傷つけるかもしれません。 –

+1

再利用能力?あなたは私をキッティングしていますか?アプリケーションデリゲートをどのように再利用するのですか?歯の杖として? –

0

投稿したコードサンプルは、アプリの終了時に何かをリリースすることを主張していません。 deallocメソッドを考えているなら、アプリケーション終了時に呼び出されません。

ドキュメントのいくつかの箇所では、Appleはdeallocを送信しないことが意図的なデザインの選択であると述べています。あなたが言ったように、アドレス空間全体を解放するほうがはるかに効率的です。 discussion on the dealloc docsを参照してください。

+0

しかしそれは呼ばれています。私は実際のデバイスでそれを確認しました。そして、この特定のdeallocはすべてのオブジェクトを強制的にdeallocにします。 彼らは言う:...アプリケーションが終了すると、オブジェクトはdeallocメッセージを送信されないかもしれません...つまり、15秒後にあなたのアプリはまだ何かを保存していれば、割り当て解除をやめて終了します。 –

+0

コードが入っているオブジェクトをリリースした場合にのみ呼び出されます。ランタイムはそれを割り当て解除していません。 – Chuck

4

私にとって唯一の答えは "一貫性"だと思います。いいえ、いつもdeallocを実装する必要はないかもしれませんが、いつもやっているのであれば、それが重要であればそれをするのを忘れることはありません。さらに、呼び出されないかもしれない2行のコードを書くのに30秒以上かかることはありません。

あなたの貴重なCPUサイクルを無駄にすることはほとんどありません(サイクルは、それほど貴重ではありませんが、違いが気付くでしょう)。これらのiPhoneアニメーションは、主にアプリケーションの起動時間/シャットダウン)アプリケーションが終了すると、ヒープのメモリ割り当て日がその背後にあるため、普通はdeallocオブジェクトに気を配らないからです。

だから、deallocUIApplicationDelegateで呼び出される可能性は低いですが、とにかくそれを行うには何か費用がかかりますか?あんまり。

+0

IMHOアプリケーションの終了体験は貴重です。もちろん、私はそれを測定すべきですが、私は割り振り解除がかなり高価になる可能性があると思います。 –

+0

あなたはすでにあなたの心を作っているので、どうしてあなたは尋ねても気にしませんでしたか? – Alex

+0

私はそのようなアプローチの問題について尋ねました。 Appleのような大規模なチームが不必要なことをすることを教えてくれることは受け入れにくい。私があなたを苛立たせてしまったら、すみません。 –

6

あなたが知っているので、Artem。

"あれば"と呼ばれる小さなゲームを試してみましょう。

もしもならあなたは素晴らしいアプリを開発します。本当にすばらしいアプリ、そして大衆はそれを愛しています!あなたの売れ行きが盛り上がり、鳥はあなたの名前を空で歌います!

しかし、AppDelegate deallocで何もしないことを選択しました。わずか数秒で、あなたは気にしないことに決めました。害は何ですか?

ああ、最初はお金の山の上で簡単に眠ります。しかし、売上高が増えて成長するにつれて、少しうずきがあなたに現れます。そして、夢が始まります。

最初に不明瞭な四角形。あなたの睡眠がますます減るにつれて、日々が過ぎ、彼らはより明確に成長します。そして、ついに、ある日、あなたが見えます。

これらはブロックです、Artem。 メモリブロック。あなたの夢の中で彼らは何をしていますか?アプリケーションが終了する前に存在から解放されているわけではありませんが、どこかに行かなければなりませんでした。アプリは消えて、電話は動いていた。

彼らはあなたのHEADに移動しました。そして、毎日、より多くのスペースを残して、より多く到着しますYOURSELF

私はこれが有益であることを願っています... Artem。

+0

+ n票(nが1に近い値の場合)。 – jbrennan

+0

それは素晴らしいです。 – Jasarien

+0

おそらくこれまでのところ最高の答えです。 –

関連する問題