Вы не должны получить доступ к _mainView
в этот момент. Это может быть трудно объяснить, так что терпите меня. Мы собираемся подсчитать, но не абсолютный счет, просто утверждения вашего кода на объекте.
Вы выделяете память для объекта и указываете на него с помощью _mainView
:
_mainView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
У вас есть 1 право собственности на этот объект. Когда вы добавляете его в качестве подпредставления другого представления, это представление также претендует на право собственности, но это не ваше, а представление. Тот факт, что объект в _mainView
застревает, является случайностью, и вы не должны на это полагаться. Затем вы отпускаете объект:
[_mainView release];
Вы отказались от претензии на владение - теперь у вас есть 0 претензий, и вы больше не должны пытаться получить доступ к этому объекту. Вам это не принадлежит. Опять же, тот факт, что он все еще существует, потому что его использует другое представление, и тот факт, что у вас все еще есть указатель на него, являются случайностями *, и вы не должны полагаться на них.
Когда приходит время обработать нажатие кнопки, вы получаете доступ к объекту, владельцем которого вы не являетесь:
[_mainView removeFromSuperView];
и это вызывает сбой, чего нельзя ожидать, но это не является необоснованным. Позволив заявкам о владении перейти к 0, вы сказали системе: «Мне больше не нужен этот объект. Я не собираюсь получать к нему доступ после этого момента. Если он исчезнет, на меня это не повлияет». На самом деле, однако, вам нужно , чтобы он оставался рядом, и вам нужен доступ к нему.
Что вам нужно сделать, так это переместить строку:
[_mainView release];
внутри действия кнопки, сразу после вызова removeFromSuperview
.
* Второй из которых можно избежать, установив _mainView = nil;
после его отпускания, в этом случае, но это не решит большую проблему.