2009-05-01 1 views
1

私はココアタッチプラットフォームでアプリケーションを開発することを学んできました。私は長い道のりを歩いてきましたが、私の周りを包み込むことができない1つの作品は、メモリ管理です。Objective-C 2.0とCLRの違いはメモリマネージメントに関してです

私は最初からやり直そうとするのではなく、比較ルートをとると思いました。私は、CLR(.net)とObjective-C 2.0の違いをあまり見つけられないので、スタックオーバーフローコミュニティがこの質問に私を助けてくれるのだろうかと思います。

Objective-C 2.0とCLRの間のメモリ管理における重要な違いは何ですか? Objective-C 2.0に関して、私はiPhone OS上で開発しており、自動リリース機能は推奨されていません。

私は.NETの背景から来ているので、何が私はObjective-Cの2.0のメモリ管理について知っておくべきことかもしれない... 2の比較のために探していたと思いますか?

ありがとうございました!

答えて

1

CLRは、仮想マシン内で実行にダウンカウントを取得するために一時変数を解放し、プロパティに割り当てます。オブジェクトのすべての割り振り解除はガベージ・コレクション・システムによって処理されます。一般にObjective-Cでは、古いCスタイルのmalloc/freeまたはretain/releaseの参照計数システムを介して手動でメモリを管理する必要があります。あなたが標準的な "C"のバックグラウンドから来たのであれば、その技術はあまりにも外に見えません。参照カウントと

、システムは、特定のオブジェクトが使用される回数をカウントする - これは、基本的に上記「保持」です。オブジェクトを使用して何かが行われると、オブジェクトは手作業で「解放」メッセージを送信し、オブジェクトの保持カウントを1減らします。カウントが0になると、システムは自動的にオブジェクトの割り当てを解除します。これはCLR/.NETに比べて非常に扱いにくいように見えますが、その仕組みはより良いパフォーマンスとより多くの制御を提供します。ガベージコレクションは、Xcodeでオプションで有効にすることができるので、

あなたはMacintosh上でのObjective-C 2.0でコーディングしている場合、あなたは幸運です。これは、CLRが提供するものに近いでしょう。 iPhoneで開発している場合、ガーベジコレクションはメモリとCPUの面であまりにもコストがかかるので、オプションではありません。メモリは手動で管理する必要があります。

幸運にも、オブジェクトに送信および「自動解放」メッセージを送信することによって一般的に使用される中間のオプションがあります。 MacintoshとiPhoneの両方に含まれるこのメカニズムは、基本的に割り当てられたオブジェクトをグローバル辞書(実際には自動解放プールと呼ばれます)にプールします。アプリケーションが存在する場合、またはプールが排水された場合は、オブジェクトは割り当て解除されます。しかし、すべてがオートリリースプールに入るわけではなく、そこにすべてを置くことも望みません。 AppleのサイトからObjective-C 2.0プログラミング言語の重要な読書を読むことをお勧めします。

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

幸運と忍耐を持っています。 Objective-Cは.Net(25歳以上)のようなブロック上の新しい子供ではありませんが、.NETが今取り入れ始めている素晴らしい機能がいくつかあります。

1

iPhoneでは手動です。メモリを確保または保持する場合は、メモリを解放する必要があります。

.NET CLRでは、ほとんどの場合、メモリの種類やオブジェクトの種類には関係ありません。

iPhoneの場合は、すべてのオブジェクトの割り当てを均等にする必要があります。initまたはreleaseを使用して保持してください。 iPhoneは単純な参照カウントメカニズムを使用しているため、カウントが0になるとオブジェクトはクリーンアップされます。

私が慣れる必要があったことの1つは、自動的に保持を行うプロパティを持つことができるため、オブジェクトを作成してプロパティに割り当てると、カウントが2になります。一時変数へのオブジェクトは、1

関連する問題