Объект освобожден - почему? где? - PullRequest
1 голос
/ 05 января 2012

Хорошо, я потратил последние 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 - но независимо от типа данных этот конкретный объект освобождается. Нужно ли что-то делать с размером строки?

Ответы [ 2 ]

1 голос
/ 05 января 2012
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain];

Автоматически отключен. Вам не нужно выпускать его в конце вашего метода. Вы преувеличиваете это.

Кроме того, вам не нужно сохранять [searchResults xmlString]. Метод stringWithFormat уже делает это за вас.

Удачи!

0 голосов
/ 05 января 2012

Хорошо, не уверен, в чем именно проблема, но это было где-то в методе searchResults и / или xmlString.searchResults объект изначально создается из XML, полученного с сервера (XML анализируется в структуре объекта).Когда был вызван xmlString, по какой-то причине возвращаемая мной строка отличалась от исходного XML (разумеется, я не говорю о форматировании) - строки длиной 200 000 символов, в пределах первых 500 символов или около того.были некоторые отличия.Я не смог понять, почему.Таким образом, вместо воссоздания xml из структуры объекта я вместо этого сохранил исходный XML в поле в этом объекте и, когда был вызван xmlString, просто возвратил исходную строку.Теперь все работало нормально.

Спасибо всем за поддержку в этом болезненном процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...