2012-01-11 4 views
2

У меня есть UIViewController, который должен лениво загружать представление, а затем хранить его в памяти, поскольку он повторно используется довольно часто, пока, например, появляется предупреждение о памяти или я хочу очистить его по какой-то другой причине. Чтобы достичь ленивой загрузки, я перезаписал получателя по умолчанию. Вот мой код:Lazy-load view в подклассе 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; или даже что-то совсем другое?

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

ответ

3

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

self.myView = nil; 

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

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

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

3

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

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

Смежные вопросы