0

メイン プロジェクトで発生している問題を解決するために、小さなテスト プロジェクトを作成しました。コンテナーからオブジェクトを取得するときに、参照カウントが増加しないことに気付きました。

なぜそうではないのか混乱していますか?

たとえば、次のコードは hereDoggy オブジェクトの参照カウントを増やしません。

//Retrieve the dog, why does this not increment the reference count?
Dog* hereDoggy = [cont1 objectAtIndex:0];

以下は完全な例です。

-(void)doZombieProblem
{
    NSMutableArray* cont1 = [NSMutableArray array];
    NSMutableArray* cont2 = [NSMutableArray array];
    NSMutableArray* cont3 = nil;


    //Create the dog pointer
    Dog* doggy = [[Dog alloc] initWithName:@"Bernard"];

    //Add to container1
    [cont1 addObject:doggy];

    //Release the dog pointer
    [doggy release];

    while ([cont1 count] > 0)
    {
        //Retrieve the dog, why does this not increment the reference count?
        Dog* hereDoggy = [cont1 objectAtIndex:0];

       //Add it to cont2
        [cont2 addObject:hereDoggy];

        //Remove it from cont1.
        [cont1 removeObjectAtIndex:0];

        //No need to release as we haven't increased the reference count.
        //[hereDoggy release];
    }

    //I should be able to retrieve the dog here from cont2.
    Dog* bernard = [cont2 objectAtIndex:0];

    //No need to release as we haven't increased the reference count.
    //[bernard release];
}
4

2 に答える 2

4

この場合、オブジェクトの保持カウントを増やしたい場合は、retain(またはcopy) メッセージを送信する必要があります。

経験則として

retains (またはcopyies) とs のバランスを常に取る必要がありますrelease。そうしないと、メモリリークが発生する可能性があります。それ以外の場合は、ARC 機能に切り替えて、記述するコード量を回避し、生活を簡素化してください。

メモリ管理がどのように機能するかを理解するための便利なリンクです。

メモリ管理

何が起こっているのかを理解するためにあなたのコードにコメントしました:

// the object referenced by doggy has a retain count of 1
Dog* doggy = [[Dog alloc] initWithName:@"Bernard"];

// now the retain count is 2 since you added to a container class like NSArray
[cont1 addObject:doggy];

// now the retain count is 1
[doggy release];

次に、whileステートメント内で次のようにします。

// the retain count still remains 1
Dog* hereDoggy = [cont1 objectAtIndex:0];

// the retain count increases to 2
[cont2 addObject:hereDoggy];

// the retain count goes to 1
[cont1 removeObjectAtIndex:0];

cont2オブジェクトは、あなたがアクセスできるように維持されているためです。

[cont2 removeObjectAtIndex:0];保持カウントが 0 に達すると、オブジェクトは自動的に割り当て解除されます。

于 2012-06-24T16:44:00.317 に答える
2

オブジェクトの保持カウントを管理するのは、オブジェクトのユーザーとしての責任です。これは、消費者であるあなただけが、いつそれを使い終わったかを知っているからです. そのため、呼び出すだけで[cont1 objectAtIndex:0]はインクリメントされません。NSArray は、それが返すオブジェクトで何を計画しているのかわかりません。

何かを所有している物の数を示す保持数を考えてみてください。0 の場合は誰も所有していないため、ガベージ コレクションにします。1 の場合、それを必要としている/所有しているのは 1 つだけです (さらに上に)。

NSMutableArrayを呼び出すと[cont1 addObject:doggy]、NSMutableArray を呼び出すとその保持カウントが減少するのと同じように、(舞台裏で) その保持カウントが完全にインクリメントさ[cont1 removeObjectAtIndex:0]れます。

hereDoggy一定の期間が必要な場合はretain、自分で呼び出してから、必要に応じて呼び出してくださいrelease

于 2012-06-24T16:29:29.683 に答える