Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSDictionary拒绝为其键设置值。_Iphone_Ios_Objective C_Nsmutabledictionary - Fatal编程技术网

Iphone NSDictionary拒绝为其键设置值。

Iphone NSDictionary拒绝为其键设置值。,iphone,ios,objective-c,nsmutabledictionary,Iphone,Ios,Objective C,Nsmutabledictionary,我有一个方法updateUserPlaceDictionary,它从一些文本字段中提取文本并将其放入NSDictionary中。在注意到字典的所有值都为空后,我尝试手动为其键设置一些字符串,如下所示: - (void)updatePlaceDictionary { //Create a dictionary that holds the location data. [self.placeDictionary setValue:[NSString stringWithFormat

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

- (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文件中合成了它


我将方法日志记录到控制台,将所有位置数据放入字典中,但得到的都是空值。我在另一个视图控制器中也有同样的功能,它工作得非常好。有没有人能告诉我他们看到什么不合适的地方

你有评论说

//创建保存位置数据的字典

但你从来没有真正创造过它。 初始化字典,你就没事了

self.placeDictionary = [NSMutableDictionary dictionary];
还要注意:
setValue:forKey:
setObject:forKey:
不同。阅读以了解有关该主题的更多信息,但一般来说,对于字典,您应该使用
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"

但是性能方面的优化程度较低(更不用说代码质量了)。

您有一条评论说

//创建保存位置数据的字典

但你从来没有真正创造过它。 初始化字典,你就没事了

self.placeDictionary = [NSMutableDictionary dictionary];
还要注意:
setValue:forKey:
setObject:forKey:
不同。阅读以了解有关该主题的更多信息,但一般来说,对于字典,您应该使用
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"

但性能方面的优化程度较低(更不用说代码质量)。

似乎您没有分配它,您可以在getter中完成

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

似乎你没有分配它,你可以在getter中完成它

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

呃,也许你真的应该创建字典??呃,也许你真的应该创建字典??一个初始化方法会更好。把它放在
init
中,你也不必担心,除非你在
init
之前运行代码。而且您不会用冗长的getter不必要地填充代码,这就是为什么称为init。初始化对象状态。字典不会起作用,因此与此问题无关。但懒惰实例化的存在是有原因的。我不同意init方法,您不应该只因为该方法名为init而初始化所有对象状态。@Moxy:当然,存在惰性初始化是有原因的。它有助于延迟核心功能不需要的特别昂贵的操作。只是没有任何理由在这里使用它。它所增加的只是冗长和低效。初始化方法将是一个更好的地方。通过将它放在
init
中,您也不必担心这一点,除非您在
init
之前运行代码。而且您不会用冗长的getter不必要地填充代码,这就是为什么称为init。初始化对象状态。字典不会起作用,因此与此问题无关。但懒惰实例化的存在是有原因的。我不同意init方法,您不应该只因为该方法名为init而初始化所有对象状态。@Moxy:当然,存在惰性初始化是有原因的。它有助于延迟核心功能不需要的特别昂贵的操作。只是没有任何理由在这里使用它。它所增加的只是冗长和低效。一个高质量的答案。不仅修复了我的问题,而且提供了将来有用的信息。我会努力记住的。谢谢你,伙计!高质量的回答。不仅修复了我的问题,而且提供了将来有用的信息。我会努力记住的。谢谢你,伙计!