我创建了一个名为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
}
答案 0 :(得分:2)
您需要从[p1 autorelease];
功能中删除setupValuesForUI
。由于您在此方法中没有alloc
或retain
,因此无需release
它。
PS。您应该[myPlayer release];
使用[myPlayer autorelease];
而不是initTheGame
,这是一种更好的编码习惯。
答案 1 :(得分:0)
这个地方有错误。
-(void) setupValuesForUI
{
NSLog(@"setupValuesForUI");
Player *p1 = [[Player alloc] init];
p1 = [playerArray objectAtIndex:0];
....
[p1 autorelease];
}