Должен ли я сохранять автоматически выпущенный объект при назначении сохраняемой собственности?

В получателе для одного из моих сохраненных свойств я выделяю и назначаю NSArray моему объекту модели («моделям»). Затем я сортирую этот NSArray, используя метод sortedArrayUsingSelector :. Согласно документации, это возвращает автоматически выпущенный NSArray. Затем я переназначаю это на свой массив «моделей».

Сначала я никогда не сохранял этот автоматически освобожденный отсортированный массив и обнаружил, что, когда я вытащил этот viewController из стека, мое приложение вылетало, говоря, что я пытался уменьшить счетчик ссылок на освобожденный объект или что-то в этом роде. Затем я добавил сохранение, как вы можете видеть в приведенном ниже коде, и все в порядке.

У меня вопрос: правильно ли я должен сохранить автоматически выпущенный объект, даже если я сохраняю это свойство в его объявлении и освобождаю его в своем освобождении?

- (NSArray *)models {

    if (!models) {
        models = [[NSArray alloc] initWithArray:[self.modelDictionary allKeys]];
        models = [[models sortedArrayUsingSelector:@selector(compare:)] retain];
    }
    return models;

}


person Jamie    schedule 21.02.2011    source источник


Ответы (2)


Если я чего-то не упускаю, похоже, что вы просто устанавливаете результат для одной из переменных вашего экземпляра. Я думаю, вам следует использовать вместо этого свое свойство.

self.models =  [NSArray arrayWithArray:[self.modelDictionary allKeys]];

Без части self. вы не используете метод установки и, следовательно, никогда ничего не сохраняете.

person D.C.    schedule 21.02.2011
comment
Я думаю, что в вашем примере вы сохраните его дважды. init не будет автоматически выпускаться, если я правильно помню, тогда как что-то вроде [NSArray arrayWithArray:[self.modelDictionary allKeys]] должно. Так что, может быть, здесь есть о чем помнить. Редактировать: Избили на минуту. - person ; 21.02.2011
comment
У тебя было больше слов и лучшее объяснение ... :) - person bbum; 21.02.2011

Спасибо! Я понимаю что ты имеешь в виду. Думаю, я запутался и подумал, что вызов self.models в моем геттере создаст бесконечный цикл. Теперь я понимаю, что это справедливо, если я вызываю геттер изнутри получателя, а не сеттер изнутри получателя. Я изменил свой код на этот:

- (NSArray *)models {
    if (!models) {
        self.models = [[NSArray alloc] initWithArray:[self.modelDictionary allKeys]];
        self.models = [models sortedArrayUsingSelector:@selector(compare:)];
    }
    return models;
}

все компилируется и работает нормально ... похоже ли это на более правильное решение? Спасибо за ваше время.

person Jamie    schedule 21.02.2011
comment
У вас все еще отсутствует выпуск, если ваше свойство настроено на сохранение. - person D.C.; 21.02.2011
comment
Итак, вы имеете в виду, что я должен назначить self.models = [NSArray arrayWithArray: [self.modelDictionary allKeys]]; вместо? Спасибо за вклад. Я относительно новичок в программировании. - person Jamie; 21.02.2011
comment
Это сработает, да ... обратите внимание, что вы, вероятно, можете столкнуться с некоторыми из серьезных проблем, которые я описал. - person bbum; 21.02.2011
comment
Спасибо за ответ. Какой метод вы предлагаете как лучший для создания экземпляра этого массива и его сортировки, если он не создает его лениво в получателе? Таким образом я пытался работать эффективно. - person Jamie; 21.02.2011