まず、プログラミング言語である Objective-C にはメモリ管理の概念がありません。メモリ管理は Foundation (Mac OS X の Cocoa と iPhone OS の Cocoa Touch の共通フレームワーク) に組み込まれています。Foundation は、Objective-C ランタイムのおよび関数の上にalloc
、 、retain
、release
およびを便利なラッパーとして実装するルートクラス NSObject を追加します。autorelease
class_createInstance()
object_dispose()
Objective-C はメモリ管理にとらわれないため、ガベージ コレクションを追加し、NSObject
ノーオペレーションですべてのメモリ管理メソッドを作成するのは非常に簡単でした。しかし、iPhone OS と従来の Mac OS X にはガベージ コレクションがなく、代わりに Cocoa の参照カウント スキームを使用しています。
Foundation で、またはFoundation からalloc
クラス メソッドを呼び出すと、オブジェクトが作成されます。これらのデフォルトの実装は呼び出しを行うため、手動で行う必要はありません。NSObject
NSProxy
class_createInstance()
dealloc
がルート クラスで実行されると、オブジェクトは「死にます」NSObject
。これは、ヒープ上のオブジェクトのメモリが を呼び出すことによって解放されるときです。Foundation から継承するか、Foundation からobject_dispose()
継承する限り、この関数を自分で呼び出す必要はありません。NSObject
NSProxy
自動解放されたオブジェクトは、ランタイムに関する限り、特別に扱われることはありません。自動解放されたオブジェクトは、他のオブジェクトと同じように機能します。autorelease
オブジェクトがおおよそである場合に何が起こりますか。
-(id)autorelease; {
[NSAutoreleasePool addObject:self]; // retain count +1
[self release]; // retain count -1
return self;
}
呼び出しautorelease
によって保持カウントが減少することはなく、オブジェクトの所有権が呼び出し元から現在の自動解放プールに転送されるだけです。後で現在の自動解放プールがrelease
なくなると、それが所有するすべてのオブジェクトが呼び出され、他のオブジェクトによって所有されなくなったオブジェクトは解放されます。