リリースされたオブジェクトが最終的に破壊されるのはいつですか?

StackOverflow https://stackoverflow.com/questions/1420731

質問

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

解放されたオブジェクトはdeallocの終了時に破棄されると仮定します([super dealloc]が呼び出されたとき)、自動解放変数がプールに追加されることを知っています。 >

歓声-gary-

役に立ちましたか?

解決

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

Objective-Cはメモリ管理に依存しないため、ガベージコレクションを追加し、 NSObject no-opsですべてのメモリ管理メソッドを作成するのは非常に簡単でした。ただし、iPhone OSおよびレガシーMac OS Xにはガベージコレクションはありません。代わりに、Cocoaで参照カウントスキームを使用します。

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

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

自動解放されたオブジェクトは、ランタイムに関する限り特別な扱いはされません。自動解放されたオブジェクトは他のオブジェクトと同じように生きています。オブジェクトを autorelease した場合の動作はおよそです。

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

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top