リリースされたオブジェクトが最終的に破壊されるのはいつですか?
-
07-07-2019 - |
質問
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
が呼び出され、他のオブジェクトによって所有されなくなったオブジェクトは解放されます。
他のヒント
はい、保持カウントがゼロになるとすぐに割り当てが解除されます。
自動解放システムは、所有権が少し「曖昧」なオブジェクト用です。 -つまり、所有したくない、存続期間が不明な新しいオブジェクトを返し、呼び出し元が責任を負うことを想定したくない場合。自動解放プールが空になったとき(通常は実行ループの前後)、すべてのメンバーが解放されます。オブジェクトを受け取った呼び出し元がオブジェクトの責任を取りたい場合、必要なのはオブジェクトを保持することだけです。これにより、割り当て解除が回避されます。