1

首先让我告诉你我是一个完全的 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:

播放器.h:

@interface PROGPlayer : NSObject
@property (nonatomic, assign) NSString *playerName;
@property (nonatomic, assign) int playerScore;
-(id) init: (NSString *) n;
-(void) printPlayer;
@end

播放器.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

4 回答 4

3

您的问题似乎在于您定义属性的方式。

您正在使用assign而不是strongcopy

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

使用副本意味着您要创建对象或值的新副本并将其设置为您的属性的值......正如马里奥和贾森解释的那样,在使用数组时使用副本是更好的做法,以防止数组被变异(即值已更改)在枚举/遍历时。使用copy也会保留新对象。

如果你使用 ARC 并且你的对象没有被保留,那么编译器会自动释放它们。

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

我想发生的事情是您将变量分配给您的财产,但该变量被释放(因此导致零)并导致崩溃。

这里有几个链接:

目标 C 新手:需要帮助理解强引用与分配

Objective-C ARC:强 vs 保留和弱 vs 分配

澄清分配,保留,复制,强?

于 2012-04-27T05:08:56.837 回答
2

您的 playerName 属性最好被复制而不是分配

@property (nonatomic, copy) NSString *playerName;

当试图访问分配的值时,对象很可能已经消失,导致访问不正确。

还记得在将属性设置为复制时在 dealloc 中释放 playerName。

干杯

于 2012-04-27T05:06:01.610 回答
1

无论是 Mike Z 所说的还是“粗鲁的”:

for (int i = 0; i < myArray.count; i++) {
    CustomClass* object = [myArray objectAtIndex:i];
    [object printPlayer];
}

虽然有更优雅的方案,但您可以清楚地了解这个方案在做什么,以及 NS(Mutable)Array 如何只是标准 C 数组的简单模拟。

于 2012-04-27T01:18:19.013 回答
1

你只想枚举数组?

for (CustomClass *object in myArray){
  [object printPlayer];
}
于 2012-04-27T00:53:18.453 回答