«[Выпуск CALayer]: сообщение отправлено освобожденному экземпляру» при отклонении контроллера модального представления - PullRequest
2 голосов
/ 11 сентября 2010

Я боролся с этим последние несколько дней и не могу найти никакого решения, поэтому прошу у вас совета.

У меня есть два UIViewController: NewPostUIViewController и SettingsUIViewController. Во втором у меня есть поле:

id<SettingsUIViewControllerDelegate> delegate

и первый реализует протокол

SettingsUIViewControllerDelegate

При нажатии кнопки в NewPostUIViewController выполняется следующий код:

SettingsUIViewController *settingsUIViewController  = [[SettingsUIViewController alloc] initWithNibName:@"SettingsView" bundle:nil]; 
settingsUIViewController.title = NSLocalizedString(@"Settings", @"Settings view title");
settingsUIViewController.delegate = self; 
[self presentModalViewController:settingsUIViewController animated:YES];
[settingsUIViewController release];

когда я хочу отклонить настройки UIViewController, который я вызываю (код в настройках UIViewController):

[delegate settingsAreDone:sender];

и настройкиAreDone выглядит следующим образом (код в NewPostUIViewController):

    [self dismissModalViewControllerAnimated:YES];

На этом все заканчивается:

[CALayer release]: message sent to deallocated instance 0x5a76840

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

Есть идеи?

1 Ответ

4 голосов
/ 11 сентября 2010

Во-первых, ошибка, которую вы получаете, не означает, что -релиз отправляется контроллеру представления, поэтому контрольные точки в ваших контроллерах представления не помогут.Переиздание происходит на CALayer, который, вероятно, является частью модальной анимации.

Сначала мы начнем с некоторых основ о делегате.Я не чувствую, что причина в этом, но вы всегда должны начинать с простых основ.Ваше свойство делегата SettingsUIViewController должно быть назначено, а не сохранено, чтобы избежать циклов сохранения.Возможно, это уже правильно, но когда это не так, вы можете столкнуться со случаями, когда объекты существуют дольше, чем вы ожидаете (и поэтому можете отправлять сообщения после того, как их цели исчезнут).Опять же, возможно, это не проблема, но ее легко проверить и легко исправить.

Далее следует взглянуть на трассировку стека при сбое.Кто звонит [CALayer release]?Возможная причина заключается в том, что владелец контроллера представления освобождается до остановки анимации.Когда вы закрываете контроллер настроек, вы сразу же закрываете контроллер NewPost?

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