Я делал весеннюю уборку в своем приложении. Я заметил что-то странное, что при попытке исправить это полностью вылетает из моего приложения.
В моем приложении есть два «пути»; либо вы находитесь в части «А», либо вы находитесь в части «Б». Из части «А» вы можете перейти к части «В» и наоборот.
Я разработал его так, чтобы у класса делегата приложения было два метода; switchToAView
и switchToBView
Таким образом, находясь в середине BView
и вызывая метод switchToAView
в делегате приложения, следует полностью освободить все, что связано с BView
, и отправить пользователя на AView
.
Я обнаружил, что при переключении на AView
представление BView
все еще сохраняется.
Каждый вид принадлежит собственности.
interface;
@property(nonatomic, retain) UIView *viewA
@property(nonatomic, retain) UIView *viewB
implementation;
@synthesize viewA, viewB
в приложении Delegate.
Я поставил точку останова в методе dealloc двух представлений. (viewA
и viewB
).
Теперь это происходит;
При загрузке viewA
и переключении на viewB
ничего не высвобождается (как и ожидалось). Затем, когда я переключаюсь с viewB
на viewA
, сначала освобождается viewA
(сгенерированным установщиком, насколько я понимаю).
а затем viewA
инициализируется и отображается.
Это прекрасно работает, но имеет недостаток в том, что и viewA
, и viewB
находятся в стеке одновременно: / это нежелательно, поскольку они взаимоисключающие. viewA
высвобождается только тогда, когда появляется новый viewA
, однако, viewA
должен высвобождаться при добавлении viewB
в окно
Затем я попытался выпустить viewA
в методе switchToBView
.
Это прекрасно работает при переходе от viewA
до viewB
. Я проверил с помощью инструментов, и количество сохранений падает до 0 для viewA
. Теперь при переключении обратно в viewA приложение вылетает, и я думаю, что это потому, что:
self.viewA = newlyInstantiatedViewA;
setter, сначала отправляет сообщение о выпуске в viewA, но я выпустил viewA ранее, и это вызывает сбой.
Я не могу понять, что использование сеттера таким образом вызовет сбой. («сообщение отправлено на освобожденный экземпляр» и разрыв в методе dealloc последнего подпредставления, добавленного в A при вызове [super dealloc])
Должен ли я выбрать другой подход все вместе?
И как мне построить что-нибудь крепкое, обеспечивающее одновременную работу только одного вида?
Извините за длинное письмо, я написал бы меньше, если бы у меня было больше времени:
Заранее спасибо за любые решения или предложения по дизайну:)