大きな違いは、objective-c
参照カウントにあります。あなたinit
がオブジェクトを所有しているとき、あなたはそれに対する所有権を主張しています。これは、オブジェクトが不要になったとき、つまり を呼び出すことによって、オブジェクトを解放する責任があることを意味します[img release]
。
init
名前がor以外で始まるメソッドへの参照を取得するとcopy
(他のプレフィックスがあるかどうかはわかりません)、これらのオブジェクトは に登録さNSAutoreleasePool
れ、プールがドレインされると自動的に解放されます。
これは次のように確認できます。
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img1 = [UIImage imageWithContentsOfFile:filePath];
UIImage *img2 = [[UIImage alloc] initWithContentsOfFile:filePath];
[pool drain];
NSLog(@"%@", [img1 retainCount]); // 1
NSLog(@"%@", [img2 retainCount]); // 0 or invalid mem access, not sure
オブジェクトのアクセサーを作成し、その結果、呼び出し元ではなくアクセサー メソッドに所有権を委譲する場合に必要な自動解放動作を実装するには、次のようにします。
[obj autorelease];
ファイル内のメソッドNSAutoreleasePool
によって 1 つのプールが既にセットアップされているため、その動作についてはあまり心配する必要はありません。NSApplicationMain
main.c
このメカニズムについては、NSObject Protocol ReferenceおよびAdvanced Memory Managementで詳しく調べることができます。