初始化NSDictionary

时间:2012-02-08 14:48:07

标签: objective-c ios xcode nsdictionary

以下是我的.h文件:

    NSDictionary *originalValues;
    @property (nonatomic, retain) NSDictionary *originalValues;

这是用于初始化NSDictionary的.m文件。

@synthesize originalValues;

- (void)viewDidLoad {

// copy original values when view loaded
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine",
                place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating,
                @"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone",
                place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter", 
                place.website, @"website", place.zipcode, @"zipcode", nil];
}

问题是只有前四个对象和键被添加。之后,它们不会被添加到以place.name,@“name”开头的字典中。我在整个字典上做了一个NSLog,输出的唯一东西是我提到的前四个值,然后我在place.name上做了一个NSLog,它输出一个值,所以我知道也应输出这个键/值对。这里有什么我想念的吗?我很好奇为什么所有的值都没有最初添加到NSDictionary中?

3 个答案:

答案 0 :(得分:61)

如果其中一个对象是nil,如果使用新的文字语法初始化NSDictionary(下面),则可以更快地捕获。这种语法不仅更短,而且更健壮:如果你的一个对象是nil,你实际上会得到一个运行时错误,而不是默默地继续执行不完整的数据。

originalValues = @{ @"city"     : place.city, 
                    @"latitude" : place.latitude,
                    // etc.
                  };

答案 1 :(得分:47)

没有添加它们的原因是因为对象是nil,它标记了字典的结尾。您需要确保每个对象都不是nil,如果是,您可以使用[NSNull null]代替它。还可以使用self.originalValues = ...进行适当的内存管理。只需确保使用字典检查/可以处理NSNull值。

使用gnu ternary extension的示例:

self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:
                         place.city ?: [NSNull null], @"city",
                         place.cuisine ?: [NSNull null], @"cuisine",
                         place.latitude ?: [NSNull null], @"latitude",
                         place.longitude ?: [NSNull null], @"longitude",
                         place.name ?: [NSNull null], @"name",
                         place.rating ?: [NSNull null], @"rating",
                         place.state ?: [NSNull null], @"state",
                         place.street ?: [NSNull null], @"street",
                         place.telephone ?: [NSNull null], @"telephone",
                         place.timesVisited ?: [NSNull null], @"times visited",
                         place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter", 
                         place.website ?: [NSNull null], @"website",
                         place.zipcode ?: [NSNull null], @"zipcode",
                         nil];

答案 2 :(得分:5)

为避免任何字典中的意外无效,如果您使用文字和三元运算符(如

)组合两种技术,那么最佳解决方案就是
self.originalValues = @{ @"city" : (place.city ?: @"city"), 
                      @"latitude" : (place.latitude  ?: [NSNull null]),
                      // etc.
                       };
  

注意:

     

(anyValueOrVariable?:@" anyOtherValueOrVariable")

     

是缩写,与

相同      

(anyValueOrVariable!= 0)? anyValueOrVariable:   @" anyOtherValueOrVariable"