Странная проблема в приложении для iPhone.
Основным видом моего приложения является View A, который является контроллером вкладок.Одна вкладка, в частности, настроена для загрузки View B. В представлении B, когда вы нажимаете кнопку, модально отображается представление C. В представлении C, в свою очередь, есть кнопка, которая при нажатии отправляет сообщение своему делегату (контроллер представления View B),и тогда делегат отклоняет представление C.
Теперь я понимаю, что представление A всегда содержит ссылку на представление B. Да?
Вот последовательность:
- Выберите вкладку, чтобы отобразить вид B.
- Нажмите кнопку, чтобы отобразить вид C (модальный).
- Нажмите кнопку, чтобы закрыть - просмотр C отправляет сообщение, контроллер просмотра B выполняет сброс.Теперь отображается представление B.
- Повторите шаги 2-3 ДВАЖДЫ.
- Освобождение контроллера представления представления B. (У меня есть NSLog в dealloc, поэтому я знаю, что это происходит).Представление по-прежнему отображается.
- Нажмите кнопку, чтобы отобразить представление C, получите «EXC_BAD_ACCESS», поскольку контроллер представления View B был освобожден, поэтому сообщению кнопки «click» больше некуда идти.
Нет предупреждений памяти, возникающих в любое время - я включил NSLog, чтобы убедиться в этом.Представление A и Представление B построены в Интерфейсном Разработчике, а не в коде, и нет абсолютно никакого написанного мною кода, который будет вызывать метод Deloc в View B.
Это всегда происходит после ТОЧНО трех повторений.
Для справки, сами кнопки программно создаются в методе ViewWillAppear View B.Вот фрагмент кода:
// create button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(column*100+24, row*80+10, 64, 64);
[button setImage:thumb forState:UIControlStateNormal];
[button addTarget:self
action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchUpInside];
Таким образом, кнопка должна отправлять сообщение «buttonClicked» в контроллер представления View B.Прекрасно работает первые три раза, перестает работать после загадочного освобождения контроллера представления.
Представление B должно никогда освобождать, поскольку это представление верхнего уровня, отображаемое на панели вкладок приложения.
Есть какие-нибудь идеи о том, где я могу начать устранение неполадок в этом?
Редактировать : Забавные мелочи.Я добавил [self retain] для viewDidLoad в View B, что должно увеличить количество сохраняемых объектов.Это делает: теперь я могу выполнить вышеуказанную процедуру ЧЕТЫРЕ раза, прежде чем я получу EXC_BAD_ACCESS.Я работаю с NSZombiesEnabled, поэтому я знаю, что это контроллер View B, который освобождается.Я просто должен выяснить, ГДЕ его счет сохранения уменьшается, поскольку я фактически не написал ни одного кода, который делает это.
Я знаю, что представление A должно было увеличить счет хранения представления B;когда представление B впоследствии отображает представление C модально, это не должно уменьшать счет, не так ли?