didReceiveMemoryWarning - вручную выгружать представления? - PullRequest
2 голосов
/ 22 октября 2010

Бывают случаи, когда didReceiveMemoryWarning вызывается, а viewDidUnload - нет.В моей ситуации я хотел бы принудительно вызвать viewDidUnload при вызове didReceiveMemoryWarning.

Я могу сказать следующее:

[self viewDidUnload];

Но действительно ли это разгрузит представления?Там нет собственного "unloadView".

Ответы [ 3 ]

5 голосов
/ 22 октября 2010

Почему вы хотите это сделать? Пока вы не забываете вызывать [super didReceiveMemoryWarning] (при условии, что вы реализуете метод вообще), UIViewController автоматически выгружает свое представление, если его представление не имеет суперпредставления. Если этот процесс не происходит, это, как правило, указывает на то, что представление все еще является частью иерархии представлений, и выгрузить его небезопасно.

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

1 голос
/ 26 января 2013

Я выполнил обширную регистрацию и настройку точки останова, исследуя, выгружает ли didReceiveMemoryWarning представление, когда UIViewController не является visibleViewController.Результаты: UIViewController view не выгружается (протестировано с использованием ARC в UINavigationController проекте) .Вам нужно установить self.view на ноль, и будет перезагружено при повторном вызове self.view.Даже запись в журнал self.view приведет к его повторной инициализации - используйте isViewLoaded для проверки, загружен ли он, вместо проверки свойства для nil.

#define String(fmt,...) [NSString stringWithFormat:fmt,__VA_ARGS__]
#define NSStringFromBOOL(aBool) String(@"%@", aBool?@"YES":@"NO")
- (void)didReceiveMemoryWarning
{
    NSLog(@"%s", __FUNCTION__); //-[ViewController didReceiveMemoryWarning]
    [super didReceiveMemoryWarning];
    if (![self.navigationController.visibleViewController isEqual:self])
    {
        NSLog(@"%@",NSStringFromBOOL(self.isViewLoaded)); //YES
        self.view = nil;
        NSLog(@"%@",NSStringFromBOOL(self.isViewLoaded)); //NO
    }
}
1 голос
/ 26 февраля 2012

Чтобы проверить мой код viewDidUnload, я сделал это

-(void)forceUnload {
    NSLog(@"forceUnload.enter");
    [super didReceiveMemoryWarning];
    NSLog(@"forceUnload.leave");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...