数组,属性和NSLog的问题

时间:2011-05-05 14:55:22

标签: objective-c

所以我有这个代码块,它将玩家添加到我的ViewController playerList中的NSMutableArray。由于某种原因,我无法将所有播放器名称打印到日志中。难道我做错了什么?我一直收到错误,指出成员引用struc objc_object是一个指针。谁能看到我做错了什么?

p1,p2,p3,p4都是只有玩家名字的NSString对象。

addPlayer方法使用名为playerName的属性创建一个新的播放器对象。

- (IBAction)addPlayerButton:(id)sender {
    [self.playerList addObject:[self addPlayer:p1]];
    [self.playerList addObject:[self addPlayer:p2]];
    [self.playerList addObject:[self addPlayer:p3]];
    [self.playerList addObject:[self addPlayer:p4]];
    for (id element in playerList) {
        NSLog(element.playerName);
    }
}

2 个答案:

答案 0 :(得分:4)

for (id element in playerList) {
    NSLog(element.playerName);
}

编译器警告/错误是因为element的类型为id,并且您不能将点语法与类型id的对象引用一起使用(创建时的特定设计选择)功能,顺便说一句。

固定代码:

for (Player *element in playerList) {
    NSLog(@"%@", element.playerName);
}

修复了两个(不相关的)问题:

  1. 明确键入element作为对您的玩家类的引用(我假设了名称)。这将允许点语法工作。

  2. 使用带有NSLog的格式字符串。如果玩家的名字曾经包含格式化序列 - 例如%@ - 那么NSLog()会尝试将下一个(不存在的)参数扩展为NSLog和您的应用会崩溃或打印垃圾(例如,如果玩家的名字是“Bob%f%f%f”)。


  3.   

    他们看起来并不像   正确添加到数组

    确保分配一个数组并将其分配给某个地方的playerList:

    self.playerList = [NSMutableArray array];
    

答案 1 :(得分:0)

请改用:

NSLog(@"%@", element.playerName);

NSLog有点像printf()和朋友,但不完全一样。您必须提供第一个参数,该参数是具有您要使用的格式的字符串文字,后跟格式中表示的任何变量。在Objective-C中,特殊格式%@表示“使用obeject的description方法填写值(如果有的话)。”有时,您会为没有该方法的对象获得类似调试器的输出,例如或者其他一些当然不太有用的东西。

在您的情况下,假设playerName是NSString,如果您在NSLog的第一个参数中使用格式%@,您将看到它的名称输出。

编辑:

您应该可以使用for这样的语句:

for(Player *p in playerList) {
    NSLog(@"%@", p.playerName); 
}

仅仅因为你使用addObject:添加对象并不意味着当你从数组中查看它们时你必须放弃使用对象的类型。

如果playerList中的对象实际上只是NSString s,那么你的循环可以只是

for(NSString *name in playerList) {
    NSLog(@"%@", name); 
}