3

Objective-C でオブジェクトを解放すると (その解放カウントが 1 であると仮定)、その解放カウントは 0 に減分され、dealloc メソッドが呼び出されます。オブジェクトはその場ですぐに破棄され、[super dealloc] の後に破棄されますか? それとも、プールに追加され、プールが空になったときに破棄されますか?

リリースされたオブジェクトは、dealloc の最後 ([super dealloc] が呼び出されたとき) に破棄されると想定します。autorelease 変数がプールに追加されることは知っていますが、通常のリリースされたオブジェクトがどうなるかを確認したかっただけです。

乾杯 -ゲイリー-

4

2 に答える 2

8

まず、プログラミング言語である Objective-C にはメモリ管理の概念がありません。メモリ管理は Foundation (Mac OS X の Cocoa と iPhone OS の Cocoa Touch の共通フレームワーク) に組み込まれています。Foundation は、Objective-C ランタイムのおよび関数の上にalloc、 、retainreleaseおよびを便利なラッパーとして実装するルートクラス NSObject を追加します。autoreleaseclass_createInstance()object_dispose()

Objective-C はメモリ管理にとらわれないため、ガベージ コレクションを追加し、NSObjectノーオペレーションですべてのメモリ管理メソッドを作成するのは非常に簡単でした。しかし、iPhone OS と従来の Mac OS X にはガベージ コレクションがなく、代わりに Cocoa の参照カウント スキームを使用しています。

Foundation で、またはFoundation からallocクラス メソッドを呼び出すと、オブジェクトが作成されます。これらのデフォルトの実装は呼び出しを行うため、手動で行う必要はありません。NSObjectNSProxyclass_createInstance()

deallocがルート クラスで実行されると、オブジェクトは「死にます」NSObject。これは、ヒープ上のオブジェクトのメモリが を呼び出すことによって解放されるときです。Foundation から継承するか、Foundation からobject_dispose()継承する限り、この関数を自分で呼び出す必要はありません。NSObjectNSProxy

自動解放されたオブジェクトは、ランタイムに関する限り、特別に扱われることはありません。自動解放されたオブジェクトは、他のオブジェクトと同じように機能します。autoreleaseオブジェクトがおおよそである場合に何が起こりますか。

-(id)autorelease; {
  [NSAutoreleasePool addObject:self];  // retain count +1
  [self release];                      // retain count -1
  return self;
}

呼び出しautoreleaseによって保持カウントが減少することはなく、オブジェクトの所有権が呼び出し元から現在の自動解放プールに転送されるだけです。後で現在の自動解放プールがreleaseなくなると、それが所有するすべてのオブジェクトが呼び出され、他のオブジェクトによって所有されなくなったオブジェクトは解放されます。

于 2009-09-14T11:19:16.593 に答える
5

はい、保持カウントがゼロになるとすぐに割り当てが解除されます。

自動解放システムは、所有権が少し「あいまい」なオブジェクト用です。つまり、所有したくない新しいオブジェクトを返す場合、その有効期間は不明であり、呼び出し元が取得すると想定したくない場合です。に対する責任。自動解放プールが空になると (通常は次回の実行ループで)、すべてのメンバーが解放されます。オブジェクトを受け取った呼び出し元が責任を負いたい場合は、オブジェクトを保持するだけで、割り当て解除を回避できます。

于 2009-09-14T10:28:39.273 に答える