Трябва ли да запазя автоматично освободен обект, когато е присвоен на запазено свойство?

В инструмента за получаване на едно от моите запазени свойства разпределям и присвоявам NSArray на моя модел обект ("модели"). След това сортирам този NSArray с помощта на метода "sortedArrayUsingSelector:". Според документите това връща автоматично пуснат NSArray обратно. След това пренасочвам това към моя масив "модели".

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

Въпросът ми е правилно ли е, че трябва да запазя автоматично освободения обект, въпреки че запазвам това свойство в неговата декларация и го освобождавам в моя dealloc?

- (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 в моя getter ще създаде безкраен цикъл. Сега виждам, че е просто да извикам гетъра от геттера, а не сетера от геттера. Промених кода си на това:

- (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