Ленивая загрузка представления в подклассе UIViewController - PullRequest
2 голосов
/ 11 января 2012

У меня есть UIViewController, который должен лениво загружать представление и затем сохранять его в памяти, так как он используется довольно часто, например, до тех пор, пока не появится предупреждение о памяти или я не хочу очистить его по какой-то другой причине.Для того, чтобы добиться ленивой загрузки, я переписал получатель по умолчанию.Вот мой код:

@interface MyController {
    MyView *_myView;
}
@property(nonatomic, retain) MyView *myView;
@end

@implementation MyController
@synthesize myView = _myView;
- (MyView *)myView {
    if(_myView == nil) {
        _myView = [[MyView alloc] init];
        // some more initialization
    }
    return _myView;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // the main part of my interest, freeing myView again
    self.myView = nil;
}
@end

Теперь мой вопрос в основном таков: правильно ли выпускать myView, как я это делал в - (void)didReceiveMemoryWarning, или мне нужно было бы [_myView release]; _myView = nil; или даже что-то совершенно другое?

Кроме того, обычно ли это правильный способ использования отложенной инициализации или я должен что-то улучшить здесь в целом?

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Ваше заявление об освобождении памяти абсолютно правильно, и между ними нет никакой разницы.

self.myView = nil;

В этом случае будет вызываться метод установки для свойства myView, аналогичный приведенному ниже.

-(void) setMyView:(MyView*) aMyView {
   [myView release];
   myView = aMyView;
}

для отложенной загрузки ... Я предполагаю -(void)viewDidDisappear для освобождения представлений и других связанных с памятью вещей и -(void) loadview для их повторного создания

3 голосов
/ 11 января 2012

Если я не ошибаюсь, поведение по умолчанию UIViewController уже загружает представление лениво, см. документацию для -loadView:

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

...