Инициализация NSDictionary
В моем файле .h находится следующее:
NSDictionary *originalValues;
@property (nonatomic, retain) NSDictionary *originalValues;
Это файл .m для инициализации 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 на весь словарь, и единственными вещами, которые были выпущены, были первые четыре значения, как я упомянул, так что тогда я сделал NSLog на place.name, и он выводит значение, поэтому я знаю, что для этого ключа/значения также нужно вывести что-то пара. Что-то мне здесь не хватает? Мне любопытно, почему все значения изначально не добавляются в NSDictionary?
Ответы
Ответ 1
Причина, по которой они не добавляются, заключается в том, что объект равен нулю, что означает конец словаря. Вы должны быть уверены, что каждый объект не 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
Если один из объектов nil
, вы можете поймать это намного быстрее, если вы используете новый синтаксис литерала для инициализации NSDictionary
(см. ниже). Этот синтаксис не только короче, но и более устойчив: на самом деле вы получите ошибку времени выполнения, если один из ваших объектов nil
вместо молчащего продолжения выполнения с неполными данными.
originalValues = @{ @"city" : place.city,
@"latitude" : place.latitude,
// etc.
};
Ответ 3
Чтобы избежать случайного нуля в любом словаре, лучшим решением было бы, если бы вы объединили две техники с использованием литерала и тройного оператора типа
self.originalValues = @{ @"city" : (place.city ?: @"city"),
@"latitude" : (place.latitude ?: [NSNull null]),
// etc.
};
Примечание:
(anyValueOrVariable?: @ "anyOtherValueOrVariable" )
является сокращением и означает то же, что и
(anyValueOrVariable!= 0)? anyValueOrVariable: @ "AnyOtherValueOrVariable"