Хорошо, я потратил последние 8 часов на борьбу с этим - это, кажется, за пределами меня. Вот мой полный (соответствующий) код:
- (void)updateUserDefaults
{
NSMutableDictionary *viewControllerDetails = [[NSMutableDictionary alloc] initWithCapacity:4];
[viewControllerDetails setObject:[NSNumber numberWithInt:OOVenueClassControllerType] forKey:@"classType"];
[viewControllerDetails setObject:self.searchTerm forKey:@"searchTerm"];
[viewControllerDetails setObject:self.searchLocation forKey:@"searchLocation"];
//----- the next two lines cause the problem
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain];
[viewControllerDetails setObject:res forKey:@"searchresults"];
//-----
NSMutableArray *viewControllersList = [NSMutableArray array] ;
[viewControllersList addObject:viewControllerDetails];
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
//the following line causes the error
[defs setObject:viewControllersList forKey:kViewControllersKey];
[defs synchronize];
[res release];
}
Обратите внимание на блок с the next two lines cause the problem
. Сначала я не создавал другую строку, но добавил ее позже, пытаясь решить проблему.
Если я закомментирую эти две строки, все будет отлично. Если я положу их обратно, я получу
- [CFString class]: message sent to deallocated instance 0xa1a9000
Что-то не так со строкой, которую я пытаюсь ввести в пользовательские настройки по умолчанию? Эта строка довольно большая (около 200 000 символов), но в прошлом я сохранял еще более длинные строки в пользовательских значениях по умолчанию.
Стоит также отметить, что если я удаляю приложение, то все работает нормально. Но при последующих запусках проблема проявляется.
Итак, как, почему и где освобождается строка? Я явно добавил retain
- но это все равно не помогает. Чего мне не хватает?
Редактировать: только что понял, я забыл сказать, что ошибка выдается в строке
[defs setObject:viewControllersList forKey:kViewControllersKey];
Кроме того, для общей информации метод - (NSString *)xmlString
в searchResults
делает именно то, что означает имя: создает строку XML с информацией из этого объекта.
Редактировать 2: Я пытался сделать что-то еще с этой строкой - преобразовать ее в NSData
, сжать с помощью zlib - но независимо от типа данных этот конкретный объект освобождается. Нужно ли что-то делать с размером строки?