2011-01-27 116 views
1

相当与Objective-C的新的,但设法到目前为止从头创建一个卡的应用程序。 游戏的思想是针对PC玩一个纸牌游戏。消息发送到释放实例

在功能updatePlayerCardView我拿到小组第一的玩家已经卡和地方按钮同组的名称在屏幕上。 这一次工作得很好,但是当函数被调用第二次就失败:

- [CFString字符串挽留]:发送到释放实例0x604ac60

一些调试和研究后的消息我计算过,在发生这种情况的行是:

[cardButton的setTitle:[的NSString stringWithFormat:@ “%@(%I)”,[基组名],[播放器getCardGroupCount:组]] forState:UIControlStateNormal];

所以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已被释放。它可能发生在两种情况:

  • 你忘了保留它的地方。你确定它保留了group
  • 你的某处释放了,你不应该。

我可以建议你两种方法如何处理这个问题:

  • 仔细阅读你的代码,以确保您妥善管理groupName寿命。
  • 您可以创建MyString类,从NSString继承它并声明groupNameMyString。然后,您可以将断点放入dealloc方法中,并查找何时解除分配。它可以帮助您找出groupName生命周期的错误。
+0

groupName在类QuartetGroup中设置: – Johan 2011-01-27 15:11:17

1

首先,不要命名方法get*get在Cocoa/iOS中有一个非常具体的含义,并且通用的getter不是它。

接下来,你用你的代码“的建立与分析”?修复它识别的所有问题。

最后,发布崩溃发生的位置的回溯。此外,发布所有与设置和管理过度释放对象相关的代码。

相关问题