2011-01-27 18 views
1

Objective-cでかなり新しいですが、これまでのところカードアプリを最初から作成することができました。 ゲームのアイデアは、PCに対してカードゲームをすることです。解約されたインスタンスに送信されたメッセージ

updatePlayerCardView関数では、プレイヤーが持っているカードのグループを取得し、グループ名とともに画面上にボタンを配置します。 これはかつてのために正常に動作しますが、関数は、それがで失敗二回呼び出されます:

- [CFStringに保持]:割り当て解除インスタンスに送信されたメッセージが0x604ac60

いくつかのデバッグとの研究の後、私はあることを考え出しこれが発生した行は、次のとおり

[cardButtonのsetTitle:[NSStringのstringWithFormat:グループ] forState:UIControlStateNormalの "%@率(%I)"、[グループグループ名]、[プレーヤーgetCardGroupCount @]。

したがって、NSStringは明らかに割り当てが解除されます。私が理解できないことは、すべてのボタンを再作成する必要があります。なぜインスタンスを解放するのですか? 毎回プレーヤーの表示を更新するより良い方法はありますか?ボタンの量は最初から分かっていません。

-(void)updatePlayerCardView { 

NSMutableArray *groups = [[[game players] objectAtIndex:0] getCardGroups]; 
Player *player = [game getPlayer:0]; 
int x = 13; 
int y = 157; 

for(int i = 0; i < [groups count]; i++) { 
    QuartetGroup *group = [groups objectAtIndex:i]; 
    int cardGroupCount = [player getCardGroupCount:group]; 

    if(cardGroupCount == [[game quartet] getCardsPerGroupCount]) { 

    }else{ 
     UIButton *cardButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     cardButton.frame = CGRectMake(x, y, 140, 37); 
     cardButton.tag = i; 
     [cardButton setTitle:[NSString stringWithFormat:@"%@ (%i)", [group groupName],[player getCardGroupCount:group]] 
        forState:UIControlStateNormal]; 
     [cardButton addTarget:self action:@selector(playerCardClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     [[self view] addSubview:cardButton]; 
     //NSLog(@"Card group added to view %@", [group groupName]); 
     if(i == 2 || i == 5 || i == 8 || i == 11) { 
       x += 157; 
       y = 157; 
     }else{ 
       y += 45; 
     } 
     } 
    } 
} 

答えて

2

groupNameは既に割り当て解除されています。次の2つの場合に発生します。

  • あなたはどこかに保持するのを忘れました。あなたはそれがgroupによって保持されていると確信していますか?
  • あなたはどこにいてもいけない場所にリリースしました。

    • は慎重にあなたのコードを読んで、あなたが適切にgroupName寿命を管理することを確実にするために:

    私はあなたの問題を処理するために、どのように二つの方法を提案することができます。

  • MyStringクラスを作成し、NSStringから継承し、groupNameMyStringと宣言できます。次に、deallocメソッドにブレークポイントを置き、割り当てが解除されたことを検出できます。 groupNameの生涯で何が間違っているか把握するのに役立ちます。
+0

groupNameがクラスQuartetGroupに設定されています: – Johan

+0

プロパティですか?そうであれば、それを保持するか、または割り当てするように指示されていますか?それが保持されていることを確認します。 – kevboh

1

まず、メソッド名をget*にしないでください。 getはCocoa/iOSで非常に特殊な意味を持ち、一般的なゲッターはそうではありません。

次に、コードに「ビルドと分析」を使用しましたか?識別するすべての問題を修正します。

最後に、クラッシュが発生している場所のバックトレースを投稿します。また、公開されたオブジェクトの設定と管理に関連するコードをすべて掲載します。

関連する問題