开始让我告诉你我是一个完整的Objective-C初学者。这是我的问题:
我有一个NSMutableArray来存储具有玩家名称和他/她得分的对象(玩家)。
我可以使用addObject
将对象添加到数组中,但是我无法遍历此数组。这个
我是怎么做的:
// Get the reference to the array
NSMutableArray *myarray = [delegate getArray];
// Create a numerator
NSEnumerator *e = [myarray objectEnumerator];
id object;
while (object = [e nextObject])
{
[object printPlayer];
}
方法printPlayer属于Player类,它只打印名称和分数。
问题是当我在阵列中有三个玩家并且我正在尝试打印内容时,它会在printPlayer方法中达到此错误:
Thread 1: EXC_BAD_ACCESS(code=1, address=0x0000008)
奇怪的是,如果我使用NSLog(@"%@", object);
代替[object printPlayer];
,它会打印对象的引用,但不会出现任何错误。
当我尝试使用[object printPlayer]
干杯
更新1: 这是我的printPlayer方法:
-(void) printPlayer
{
NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore);
}
更新2:
Player.h:
@interface PROGPlayer : NSObject
@property (nonatomic, assign) NSString *playerName;
@property (nonatomic, assign) int playerScore;
-(id) init: (NSString *) n;
-(void) printPlayer;
@end
Player.m:
#import "PROGPlayer.h"
@implementation PROGPlayer
@synthesize playerName;
@synthesize playerScore;
/**
* Player's class constructor
* @param n Player's name
* @param s Player's score
*/
-init: (NSString *) n
{
if (!(self = [super init])) return nil;
else
{
playerName = n;
playerScore = 0;
}
return self;
}
-(void) printPlayer
{
NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore);
}
@end
答案 0 :(得分:3)
您的问题似乎与您定义属性的方式有关。
您使用分配而不是强,或复制。
简而言之,这是因为强意味着您希望保留您的对象。
使用 copy 意味着您要创建对象或值的新副本并将其设置为您的属性值...正如Mario和Jarsen所解释的那样,使用 copy < / strong>在使用数组时更好的做法是防止数组在枚举/遍历时发生变异(即值已更改)。使用复制也会保留新对象。
如果您使用ARC并且未保留对象,则编译器将自动释放它们。
使用assign意味着您假设新对象已在其他位置保留,并且您不想再保留它。
我认为发生的事情是您将变量分配给您的属性,但变量被释放(因此导致nil)并导致崩溃。
以下是一些链接:
New to Objective C: Need help understanding strong reference vs assign
答案 1 :(得分:2)
最好复制您的playerName属性而不是分配
@property (nonatomic, copy) NSString *playerName;
当尝试访问指定的值时,对象很可能消失,从而导致访问不良。
还记得在设置要复制的属性时在dealloc中释放playerName。
干杯
答案 2 :(得分:1)
你只想枚举数组?
for (CustomClass *object in myArray){
[object printPlayer];
}
答案 3 :(得分:1)
Mike Z所说的或“粗暴”:
for (int i = 0; i < myArray.count; i++) {
CustomClass* object = [myArray objectAtIndex:i];
[object printPlayer];
}
虽然有更优雅的方案,但您可以清楚地了解这个方案正在做什么,以及NS(Mutable)数组如何只是标准C数组的简单模拟。