2

私の「connect4」スタイルのゲームでは、7x6 グリッドを表す配列があり、配列内の各「セル」には、NSNull または UIView サブクラス「CoinView」が含まれています。NSMutableArray とプライマリ ビューからオブジェクトを削除する正しい方法は次のとおりですか?

- (IBAction)debugOrigin:(id)sender {
    int x = 0;
    int y = 0;
    //get the coin object form the grid
    CoinView *coin = [[grid objectAtIndex:x] objectAtIndex:y];

    //cancel if there's no coin there
    if ([coin isKindOfClass:[NSNull class]]) { return; }

    //remove the coin from memory
    [coin removeFromSuperview];
    coin = nil;
    [[grid objectAtIndex:x] setObject:[NSNull null] atIndex:y]; //will this leak?

}

ありがとう!

4

1 に答える 1

3

あなたのコードは漏れることはなく、実際 (ほぼ) 正しいです。

コードでメモリを扱っていないため、このコメントを削除する必要があります (コードが実際に何をするかについて混乱を招く可能性があります)。

//remove the coin from memory

次の行では、ローカル変数「coin」によって参照されるビューをスーパービューから削除しています。

[coin removeFromSuperview];

そして、nil をローカル変数 coin に割り当てます。これは、コードの後半で使用されないようにするための良い方法です。

coin = nil;

私の知る限りsetObject:AtIndex:、NSMutableArray はありません。replaceObjectAtIndex:withObject:代わりに使用してください:

[[grid objectAtIndex:x] replaceObjectAtIndex:y withObject:[NSNull null]]; //will this leak?

最後に、メモリ管理メモリ リーク(Apple の開発者向けドキュメントから)について少し読むことをお勧めします。1 つ目は、メモリ管理をより理解しやすくするためのヒントを提供します。

于 2012-05-27T06:32:55.887 に答える