遍历NSMutableArray?

时间:2012-04-27 00:43:15

标签: objective-c nsmutablearray traversal

开始让我告诉你我是一个完整的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

4 个答案:

答案 0 :(得分:3)

您的问题似乎与您定义属性的方式有关。

您使用分配而不是,或复制

简而言之,这是因为意味着您希望保留您的对象。

使用 copy 意味着您要创建对象或值的新副本并将其设置为您的属性值...正如Mario和Jarsen所解释的那样,使用 copy < / strong>在使用数组时更好的做法是防止数组在枚举/遍历时发生变异(即值已更改)。使用复制也会保留新对象。

如果您使用ARC并且未保留对象,则编译器将自动释放它们。

使用assign意味着您假设新对象已在其他位置保留,并且您不想再保留它。

我认为发生的事情是您将变量分配给您的属性,但变量被释放(因此导致nil)并导致崩溃。

以下是一些链接:

New to Objective C: Need help understanding strong reference vs assign

Objective-C ARC: strong vs retain and weak vs assign

Clarification on assign, retain, copy, strong?

答案 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数组的简单模拟。