Отпускание контроллера содержимого модального представления приводит к: выпуску CALayer - сообщение отправлено освобожденному экземпляру - PullRequest
0 голосов
/ 14 июля 2010

Я пытаюсь представить viewcontroller модально:

- (IBAction)addReference {

    ReferenceAddViewController *referenceAddViewController = [[ReferenceAddViewController alloc] initWithNibName:@"ReferenceAddViewController" bundle:nil];
    [referenceAddViewController setDelegate:self];

    [self presentModalViewController:referenceAddViewController animated:YES];

    [referenceAddViewController release];
}

Однако, если я вызываю [referenceAddViewController release], позже, когда модальное представление отклоняется, мое приложение вылетает с "[релиз CALayer]: сообщение отправлено на освобожденный экземпляр 0x4b90370 ".

Выполнение трассировки стека и истории подсчета ссылок в Инструментах не дало ничего окончательного, только с двумя шагами истории.

  • 0:Сохранить счет 1 - Malloc по presentModalViewController в моем коде.
  • 1: Сохранить счетчик -1 - в моем коде нет ничего, кроме main.m

Очень интересно, как подсчет ссылок пропускается от 1 до -1?Регистрирует ли прибор все изменения счетчика ссылок?

Как мне продолжить отладку этой проблемы?

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Нет необходимости освобождать контроллер вида после того, как модальный контроллер вида уволен.presentModalViewController:animated: увеличивает retainCount на 1, а dismissModalViewControllerAnimated: уменьшает его на 1.

Поэтому, когда вы выделяете его (+1), представляете его (+1) и отпускаете (-1),и позже это отклонено (-1) retainCount будет 0, объект будет освобожден, и все в порядке.Если вы попытаетесь освободить его после того, как он был удален, объект уже был освобожден, и он не будет работать.

0 голосов
/ 16 июля 2010

Спасибо за ваш ответ, я всегда думал, что когда вы вызываете alloc, вы увеличиваете счетчик ссылок до 1 в начале?

В таком случае, станет ли счетчик ссылок равным 2 при вызове presentModalViewController: animated:?

Когда модальное представление отклоняется, оно снова становится 1, но никогда не 0, потому что я не выпустил?

...