0

私はObjective-C言語のメモリ管理ガイドを読みましたが、この章を何度も読んだ後でも、これはまだ疑問です。

次のようなオブジェクトのメソッドで作成したオブジェクトを返したいとします。

NSString* ret = [[NSString alloc] initWithString:@"My string"];
return ret;

私はこれを行うことができますが、所有権ポリシーに従って正しくありません。ガイドは、正しい解決策は次のようになると述べています。

NSString* ret = [[NSString alloc] initWithString:@"My string"];
return [ret autorelease];

自動リリースしているので、私はもはや所有者ではないからです。私の質問は、NSStringが実際にリリースされ、割り当てが解除されるのはいつかということです。最後に初期化されたプールが解放されたのはいつですか?これは、プールを作成しない場合、アプリケーションが閉じられたときにこのオブジェクトが解放されることを意味します(xcodeがデフォルトで作成するプールは最後に解放されます)。これは正しいです?同じことが、次のように私によって割り当てられていないオブジェクトにも当てはまります。

NSString* ret = [NSString stringWithString:@"My string"];

?他の場所で解放するためのプールを作成しない場合、xcodeによって作成されたプールが解放されるときに、アプリケーションの最後に解放されますか?ご説明いただきありがとうございます。

4

3 に答える 3

2

に電話するとautorelease、所有権が最寄りの自動解放プールに渡され、次の排水口で解放されます。

常に最も外側の自動解放プールが存在する必要がありますが、通常はアクションに近い他のプールが存在します。これらを明示的に作成する必要はありませんが、作成することもできますが、プログラムのビジネスを進める過程で、Cocoaフレームワークによって作成されます。

フレームワークに渡さない非GUIツールをコーディングしていて、別のプールを作成drainしたり、既存のプールを呼び出したりしない場合、オブジェクトは、プール自体が終了する直前に解放されます。それ以外の場合は、イベント処理サイクルの最後にリリースされるのが最も一般的です。これは、フレームワークがプールを維持する重要な場所の1つです。

一般に、コンビニエンスクラスメソッドを介して作成されたオブジェクトの場合は、割り当てられて自動解放されたものと同じです。たまたま、引用するものは、ベースが定数文字列であり、まったく同じ方法で管理されないNSStringため、少し異なります。しかし、それは実装の詳細です。

于 2010-11-27T01:02:13.570 に答える
2

オブジェクトは、自動解放されると現在の自動解放プールに入ります。プール自体が送信されるとrelease(またはdrain、同じことです)、プール内のオブジェクトも送信されreleaseます。ほとんどの場合、現在の自動解放プールがいつ作成および解放されるかについては、自動解放に関するメモリ管理ガイドの章に次のように記載されています。

アプリケーションキットは、マウスダウンイベントなどのイベントサイクル(またはイベントループの反復)の開始時にプールを自動的に作成し、終了時に解放します

したがって、実際には、自動解放されたオブジェクトは、アプリの有効期間が終了する前、実際には次のtouch/mouseMovedイベントメッセージが送信される前に非常に迅速に消えます。

独自のローカル自動解放プールを作成して、必要に応じてすぐに削除することもできますが、これは通常、マイクロ最適化であり、実際には少し遅くなる可能性があります(必ずしも作成せずに送信されるメッセージの数が増えます)それ以外の場合は時間がかかりません)。

于 2010-11-27T02:36:41.780 に答える
1

-autoreleaseこれは遅延メッセージング機能に他ならないことを覚えておいてください。-autoreleaseオブジェクトに送信すると、現在の自動解放プールはそのオブジェクトをリストに追加し、プールが空になるか解放されると、リスト内のすべてのオブジェクトに-releaseメッセージを送信します。

于 2010-11-27T01:48:19.070 に答える