NSDictionary拒绝为其键设置值。

时间:2013-08-28 23:58:28

标签: iphone ios objective-c nsmutabledictionary

我有一个方法updateUserPlaceDictionary,它从一些文本字段中提取文本并将其抛出到NSDictionary中。在注意到字典的所有值都为null之后,我尝试手动为其键设置一些字符串,如下所示:

- (void)updatePlaceDictionary {
    //Create a dictionary that holds the location data.
    [self.placeDictionary setValue:[NSString stringWithFormat:@"155 Bovet Rd"] forKey:@"Street"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"san mateo"] forKey:@"City"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"ca"] forKey:@"State"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"94402"] forKey:@"ZIP"];

    NSLog(@"%@, %@, %@, %@", [self.placeDictionary objectForKey:@"Street"],
          [self.placeDictionary objectForKey:@"City"],
          [self.placeDictionary objectForKey:@"State"],
          [self.placeDictionary objectForKey:@"ZIP"]);
}

这是我对placeDictionary的声明:

@property NSMutableDictionary* placeDictionary;

另外,我确实确保在.m文件中合成它。

我有方法记录到控制台的所有位置数据放入字典但我得到的都是空值。我在另一个完全正常工作的视图控制器中具有相同的功能。有人能告诉我他们是否看到任何不当行为?

2 个答案:

答案 0 :(得分:10)

您有评论说明

  

//创建一个包含位置数据的字典。

但你从未真正创造它。 初始化字典,你会没事的。

self.placeDictionary = [NSMutableDictionary dictionary];

另外要注意:setValue:forKey:setObject:forKey:不同。请阅读this answer以了解有关此主题的更多信息,但一般情况下,您应使用setObject:forKey:进行词典,例如

[self.placeDictionary setObject:@"155 Bovet Rd" forKey:@"Street"];

或语法的现代版本:

self.placeDictionary[@"Street"] = @"155 Bovet Rd";

使用Objective-C文字实际上可以使整个代码更好,检查出来:

self.placeDictionary = @{
    @"Street": @"155 Bovet Rd",
    @"City"  : @"san mateo",
    @"State" : @"ca",
    @"ZIP"   : @"94402"
};

请注意,文字语法会产生一个不可变的字典,可能不符合您的需要。

作为最后的评论,请不要使用

[NSString stringWithFormat:@"aString"]

因为在语义上等同于

@"aString"

但在性能方面不太优化(更不用说代码质量)。

答案 1 :(得分:2)

看起来你没有分配它,你可以在getter中完成它。

-(NSMutableDictionary *)placeDictionary
{
    if (!_placeDictionary) {
        _placeDictionary = [NSMutableDictionary dictionary];
    }
    return _placeDictionary;
}