2011-07-29 8 views
0

私は同様の問題を検索しようとしましたが、良い解決策は見つかりませんでした。だから私は誰かが私を助けることを願っていますメモリリーク、nsmutablearrayおよびカスタムオブジェクト

は基本的に私は、カードのオブジェクトと配列を移入し、この方法では、リーク(tempArrayはこのループ上に作成し、移入さ)があります。

for(int i = 0; i < numberOfCards; i += 2) { 
    int randomNumber = (arc4random() % [tempArray count]); 
    NSNumber *number = [tempArray objectAtIndex:randomNumber]; 
    [tempArray removeObject:number]; 

    Card *card1 = [[Card alloc] initWithCategory:category andNumber:[number intValue]]; 
    Card *card2 = [[Card alloc] initWithCategory:category andNumber:[number intValue]]; 

    [number release]; 

    [cards addObject:card1]; 
    [cards addObject:card2]; 
} 

の方法は、もう少しロジックが含まれていますが、私はこのループには漏れが含まれていることは間違いない。私がInstrumentsで実行すると、Cardオブジェクトは解放されません。私は配列を解放するdeallocメソッドで、私はこれも配列内のオブジェクトを解放すると思った?

-(void) dealloc { 
    [cards release]; 

    [super dealloc]; 
} 

私はcard1とcard2でautoreleaseを試してみましたが、クラス変数にしようとしました。しかし、何も助けてくれないようです。いずれかがリークしているか、またはカード1またはカード2にリリースを追加しようとすると、アプリケーションがクラッシュします。誰でもここで何が間違っているのか考えていますか?

+0

N.B.後あなたはそれを所有していないので 'number'を解放してはいけません。 – albertamg

+0

よろしくお願いします。 –

+0

あなたは大歓迎です:) – albertamg

答えて

2

cardsに追加した後、それぞれのCardオブジェクトをリリースする必要があります。 cardsに追加すると、各オブジェクトの保持数が自動的に増加します。したがって追加:

[card1 release]; 
[card2 release]; 

[cards addObject:card1]; 
[cards addObject:card2]; 
+0

ありがとうございます。しかし、私は[カードリリース]と呼ぶとき、deallocメソッドでクラッシュします。 理由がわかりません。 –

+0

[カード保持]; cards = [[NSAMutable alloc] ..];と書かれているコード内のすべての場所を探します。あなたが[カードリリース]と言うすべての場所。彼らはお互いをキャンセルするべ​​きです。 –

+0

最後に、助けてくれてありがとうございます。カードオブジェクトには2つの特性があると私は思っていません。設定をimage = ...とtext = ...からself.image =とself.text =に変更したときに動作しました。なぜなのかご存知ですか? –

関連する問題