2012-02-08 84 views
20

以下是我的.h文件中:初始化的NSDictionary

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

这是.m文件给init的NSDictionary。

@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中?

回答

43

他们没有被添加的原因是因为一个对象是零,它标记字典的结尾。您需要确保每个对象不是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

@TReddy我在所有的C和C++编码中避免了这个三元表达式。但是因为这是Objective-C,通常只使用gcc或Apple的llvm编译,所以我发现使用它没有问题。 – Joe 2012-02-08 15:07:16

54

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

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

虽然字面语法更好,更偏好,但我不确定当一个值为'nil'时,OP正在寻找运行时错误。 – Joe 2015-03-17 12:45:40

0

为了避免在任何字典意外零最好的解决办法是,如果你结合使用文字和三元运营商像

self.originalValues = @{ @"city" : (place.city ?: @"city"), 
         @"latitude" : (place.latitude ?: [NSNull null]), 
         // etc. 
         }; 

注意两个工艺:

(anyValueOrVariable?:@“anyOtherValueOrVariable”)

是缩写,意思与

(anyValueOrVariable!= 0)相同? anyValueOrVariable: @“anyOtherValueOrVariable”