次のコードについて明確にする必要があります。
ClassA オブジェクトを含む配列があります。次に、そのオブジェクトの 1 つを取得し、それをローカル変数 object1 に割り当てます。
ClassA object1 = [ClassAObjectContainer objectAtIndex:0];
( Q.1 - これは保持数を増やしますか?? 私はそうではないと思います )
今、私はオブジェクトを削除します
[ClassAObjectContainer removeObjectAtIndex:0];
( Q.2 - object1 は割り当て解除されたインスタンスを指すようになりましたか?? メッセージを送信するとクラッシュしますか??
だから私は ClassA object1 = [[ClassAObjectContainer objectAtIndex:0] preserve]; を使用する必要があります。オブジェクトを生かしておき、後で使用したい場合。
オブジェクトがメソッドから返されるときのより良いアプローチはどれですか
- (ClassA *)calle
{
ClassA *object1 = [[ClassA alloc] init];
return [object1 autorelease];
}
- (void)Caller
{
ClassA *object2 = [self calle];
//now suppose object1 is auto-released, so in this case object2 points to deallocated instance?
}
だったらいいじゃないか――
- (void)CallerMethod
{
ClassA *object2 = [[self calle] retain];
// Do other works.
/.....
[object2 release];
}
この場合に起こった別のこと、
- (ClassA *)calle2
{
ClassA *object1 = [[ClassA alloc] init];
return [object1 autorelease];
}
- (void)CallerMethod
{
ClassA *object2 = [self calle];
object2 = [self calle2];
}
ここでメモリ リークがありますか、それとも ClassA *object2 = [self calle] が weak/assign であるため、2 回目の初期化 object2 = [self calle2] の後は問題ありません。この方法で 100 個のオブジェクトを割り当てることができ、メモリ リークは発生しません。
御時間ありがとうございます。