これが私が参照しているコードです。
// Person.h
@interface Person : NSObject {
NSString *firstName;
NSString *lastName;
}
@end
// Person.m
@implementation Person
- (id)init {
if (![super init]) return nil;
firstName = @"John";
lastName = @"Doe";
}
@end
// MyClass.m
@implementation MyClass
.....
- (NSArray *)getPeople {
NSMutableArray *array = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < 10; i++) {
Person *p = [[Person alloc] init];
[array addObject:p];
}
return array;
}
.....
@end
これで、このサンプル コードではメモリ管理が行われていないことがわかりました。何が必要ですか?
getPeople ループでは、Person (retainCount 1) を割り当て、それを配列に追加しています。リテイン回数が2回になりましたよね?2 の場合、配列に追加した後に [p release] して、retainCount を 1 に戻す必要がありますか?
メソッドによって返された配列を解放するのは呼び出し元の責任であるという点で、私は正しいですか? (カウントが 1 であると仮定すると、Person のメモリとそのインスタンス変数も解放されます)。
Apple のメモリ管理に関するドキュメントを読みましたが、最も不明な点は、オブジェクトの保持カウントが増加することでしょうか? 誰がリリースする責任があるのかという考えは理解できたと思いますが。Apple によると、これが基本的なルールです。
名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、alloc、newObject、または mutableCopy) を使用してオブジェクトを作成した場合、または保持メッセージを送信した場合、オブジェクトの所有権を取得します。release または autorelease を使用して、所有しているオブジェクトの所有権を放棄する責任があります。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。
bobDevil の文「アイテムに明示的に追加する保持カウントについてのみ心配する」という文は、私にぴったりでした。Apple の所有権ポリシーを読んだ後、基本的には、新しいオブジェクトを作成したオブジェクト/メソッドが、そのオブジェクトへの関心を解放する責任を負います。これは正しいです?
ここで、オブジェクトを受け取り、それをインスタンス変数に割り当てるメソッドがあるとします。まだ興味があるので、受け取ったオブジェクトを正しく保持する必要がありますか?
これのいずれかが正しくない場合は、お知らせください。