2008-12-04 5 views
14

Когда доступ к представлению свойства UIViewController, он сначала проверяет, есть ли у него существующее представление, и возвращает его. Если нет, он загружает свой наконечник или вызывает -loadView.Лучший способ определить, что UIViewController загружен и имеет действительный вид?

Когда контроллер получает сообщение -didReceiveMemoryWarning, поведение по умолчанию заключается в удалении этого кэшированного представления (при условии, что оно не используется в то время).

Если я переопределяю -didReceiveMemoryWarning, как я могу определить, было ли очищено представление? Я понимаю, что реализация по умолчанию проверяет, есть ли self.view.superview == nil. Если это так, он очищает кешированный вид. Конечно, сначала он проверяет, есть ли , а если нет, он ничего не делает. Тем не менее, я, как подкласс, не могу вызвать self.view.superview, поскольку если не является, он будет генерировать его.

Итак, как мне понять, существует ли _view? (Я не могу просто взглянуть на _view: у меня возникают ошибки при создании для устройства).

ответ

3

Я думаю, что в вашей ситуации это лучше сделать что-то вроде:

- (void)setView:(UIView *)view 
{ 
    if (!view) 
    { 
     // Clean up code here 
    } 

    [super setView:view]; 
} 
+0

Это кажется несколько хрупким (он полагается на Apple, всегда используя свои собственные устройства доступа), но, похоже, работает. Благодаря! – 2008-12-06 03:36:28

+1

Я согласен, что он немного хрупкий, но нет ничего документированного и, безусловно, менее хрупкого, чем прямой доступ к ivars – 2009-05-21 20:37:52

0

Вы можете использовать object_getIvar(), чтобы получить значение без прохождения через аксессор. По сути, он позволяет вам перейти на просмотр без необходимости связывания с ним. С другой стороны, у него есть возможность сломаться, если фактический ivar уходит или переименовывается. Традиционно это никогда не вызывало особого беспокойства, но iPhone использует современную среду исполнения, которая не страдает от хрупких проблем базового класса, поэтому Apple может чувствовать себя более склонной к этим изменениям.

66

С iPhone OS 3.0, вы можете использовать метод isViewLoaded, чтобы увидеть, если загружен вид.

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