iOS UIViewController освобождает себя? - PullRequest
1 голос
/ 15 сентября 2010

Странная проблема в приложении для iPhone.

Основным видом моего приложения является View A, который является контроллером вкладок.Одна вкладка, в частности, настроена для загрузки View B. В представлении B, когда вы нажимаете кнопку, модально отображается представление C. В представлении C, в свою очередь, есть кнопка, которая при нажатии отправляет сообщение своему делегату (контроллер представления View B),и тогда делегат отклоняет представление C.

Теперь я понимаю, что представление A всегда содержит ссылку на представление B. Да?

Вот последовательность:

  1. Выберите вкладку, чтобы отобразить вид B.
  2. Нажмите кнопку, чтобы отобразить вид C (модальный).
  3. Нажмите кнопку, чтобы закрыть - просмотр C отправляет сообщение, контроллер просмотра B выполняет сброс.Теперь отображается представление B.
  4. Повторите шаги 2-3 ДВАЖДЫ.
  5. Освобождение контроллера представления представления B. (У меня есть NSLog в dealloc, поэтому я знаю, что это происходит).Представление по-прежнему отображается.
  6. Нажмите кнопку, чтобы отобразить представление 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 модально, это не должно уменьшать счет, не так ли?

1 Ответ

1 голос
/ 15 сентября 2010

Не могу сказать, не видя код, но если я угадаю:

  1. На третьем шаге, когда вы отпускаете контроллер вида C вместо выпуска контроллера вида C, вы случайно отпускаете B. Этотребуется время, чтобы ошибка появилась, потому что B имеет несколько остатков от других объектов.Однако каждый раз, когда вы выпускаете C, вы уменьшаете счетчик релизов до тех пор, пока он не достигнет нуля.
  2. У вас где-то есть собственный метод доступа, например свойство делегата C, которое отправляет релиз B при обращении к нему.Та же картина, что и (1).

Я предлагаю вам выполнить поиск проекта по выпуску и проверить все выпуски, чтобы увидеть, есть ли у них B. В стандартной настройке не должно быть явных выпусков B.

Вы могли бытакже переопределите метод release B для регистрации, когда он получит релиз (не забудьте вызвать super), который покажет вам, когда происходят релизы, что даст вам представление о том, где они происходят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...