我的对象似乎被删除了,我请求。 EXC_BAD_ACCESS

时间:2010-09-06 10:19:22

标签: iphone objective-c

我创建了一个名为player的自定义对象数组。

@interface Player : NSObject 
{
    NSString *name;
    NSNumber *spd;
    NSNumber *atk;
    NSNumber *def;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *spd;
@property(nonatomic, retain) NSNumber *atk;
@property(nonatomic, retain) NSNumber *def;

@end

#import "Player.h"


@implementation Player

@synthesize name;
@synthesize spd;
@synthesize atk;
@synthesize def;

@end

这似乎没问题。

所以我有一个设置一个充满Player对象的数组的函数。

-(void) initTheGame
{
    NSLog(@" initTheGame");

    playerArray =[[NSMutableArray alloc] init];

    p1Cards =[[NSMutableArray alloc] init];
    p2Cards =[[NSMutableArray alloc] init];

    for (int i = 0; i < 20; i++)
    {
        Player  *myPlayer = [[Player alloc] init];
        myPlayer.name =[NSString stringWithFormat:@"Name%d", (rand()%99)];
        myPlayer.spd = [NSNumber numberWithInteger:(rand() % 100)]; 
        myPlayer.atk = [NSNumber numberWithInteger:(rand() % 100)]; 
        myPlayer.def = [NSNumber numberWithInteger:(rand() % 100)]; 
        [playerArray addObject:myPlayer];       
        [myPlayer autorelease];     
    }

    [self dealHands];
    [self setupValuesForUI];

}

它按预期工作。填充包含随机数据的Player对象数组。

-(void) setupValuesForUI
{
    NSLog(@"setupValuesForUI"); 

    Player *p1 = [[Player alloc] init];
    p1 = [playerArray objectAtIndex:0];

    p1Name.text = p1.name;
    [p1Speed setTitle:[NSString stringWithFormat:@"Spd: %@",[p1.spd stringValue] ] forState:UIControlStateNormal];
    [p1Attack setTitle:[NSString stringWithFormat:@"Atk: %@",[p1.atk stringValue] ] forState:UIControlStateNormal];
    [p1Defense setTitle:[NSString stringWithFormat:@"Def: %@",[p1.def stringValue] ] forState:UIControlStateNormal];    

    [p1 autorelease];

}

此函数使用一些IBOutlets设置Lable和3个按钮的Text值。所有工作都可以显示数据。

现在,当我按下按钮并调用IBAction方法时,我的应用程序崩溃了 EXEC_BAD_ACCESS

代码没有改变,我尝试以相同的方式访问对象,但似乎已经消失了。 :(

有人可以解释我做错了什么。我是Objective C的新手,请原谅我,如果这是 对你来说是个明显的问题。我可以在尝试调试它之后找到它。

-(IBAction) spd
{

    Player *p1 = [[Player alloc] init];
    p1 = [playerArray objectAtIndex:0];
    int x = [p1.spd integerValue];  // this line crashes out the app
}

2 个答案:

答案 0 :(得分:2)

您需要从[p1 autorelease];功能中删除setupValuesForUI。由于您在此方法中没有allocretain,因此无需release它。

PS。您应该[myPlayer release];使用[myPlayer autorelease];而不是initTheGame,这是一种更好的编码习惯。

答案 1 :(得分:0)

这个地方有错误。

-(void) setupValuesForUI
{
    NSLog(@"setupValuesForUI"); 

    Player *p1 = [[Player alloc] init];
    p1 = [playerArray objectAtIndex:0];

    ....
    [p1 autorelease];

}