Ответ 1
Я думаю, что в вашей ситуации лучше всего сделать что-то вроде:
- (void)setView:(UIView *)view
{
if (!view)
{
// Clean up code here
}
[super setView:view];
}
Когда открывается свойство view для UIViewController, он сначала проверяет, получил ли он существующее представление и возвращает его. Если нет, он загружает свой наконечник или вызывает -loadView.
Когда контроллер получает сообщение -didReceiveMemoryWarning, поведение по умолчанию заключается в удалении кэшированного представления (если оно не используется в то время).
Если я переопределяю -didReceiveMemoryWarning, как я могу определить, было ли очищено представление? Я понимаю, что реализация по умолчанию проверяет, есть ли self.view.superview == nil. Если это так, он очищает кешированный вид. Конечно, сначала он проверяет, есть ли кешированный вид, а если нет, он ничего не делает. Однако я, как подкласс, не могу вызвать self.view.superview, поскольку, если нет представления, он будет генерировать один.
Итак, как мне понять, существует ли _view? (Я не могу просто взглянуть на _view, я получаю ошибки связывания при создании для устройства).
Я думаю, что в вашей ситуации лучше всего сделать что-то вроде:
- (void)setView:(UIView *)view
{
if (!view)
{
// Clean up code here
}
[super setView:view];
}
С iPhone OS 3.0 вы можете использовать метод isViewLoaded
, чтобы увидеть, загружено ли представление.
Вы можете использовать object_getIvar(), чтобы получить значение без прохождения через accessor. По сути, он позволяет вам перейти на просмотр без необходимости связывания с ним. С другой стороны, у него есть возможность сломаться, если фактический ivar уходит или переименовывается. Традиционно это никогда не вызывало особого беспокойства, но iPhone использует современную среду исполнения, которая не страдает от хрупких проблем базового класса, поэтому Apple может чувствовать себя более склонной к этим изменениям.