以下是我的.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中?
答案 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"