Проблема отладки XCode и ARC (пропуская dealloc) - PullRequest
7 голосов
/ 13 октября 2011

Я потратил некоторое время на отладку странной проблемы с ARC и пользовательскими функциями dealloc.

  1. Я подклассифицирую NSOperation класс
  2. Я установил блок завершения для этой операции
  3. На операцию ссылается сильное свойство очень плоский объект (без методов, автоматических иваров, два сильных свойства), позволяющий вызвать этот объект DataRequest
  4. следуя всем рекомендациям, блок завершения использует только слабые ссылки на локальные объекты (включая саму операцию)
  5. ни компилятор, ни анализатор не генерируют никаких проблем
  6. DataRequest содержит ТОЛЬКО ссылку на сгенерированную мной операцию и уничтожается в блоке завершения операции. Он ВСЕГДА уничтожен (его dealloc всегда выполняется)
  7. Моя операция имеет пользовательский dealloc. У меня только один вызов NSLog.

... и проблема:

Если я запускаю это в отладчике, точка останова в dealloc никогда не будет достигнута, сообщение журнала никогда не появится. В первую очередь я думал, что операция протекает.

Если я запускаю это на инструментах, все в порядке, системная консоль печатает сообщение, а инструмент Allocations сообщает об освобождении операции из правильного снимка стека, включая пользовательский dealloc. Утечек не обнаружено.

Я уверен на 100%, что использую одни и те же настройки компилятора для отладки и для профилирования.

Самое запутанное в конце: если я создаю пользовательскую версию [DataRequest dealloc] и добавляю к ней self.operation = nil; - все отлично работает даже из отладчика.

У кого-нибудь есть подсказки, какие опции компоновщика компилятора пытаются увидеть разницу? может ли это быть ошибкой в ​​инструментах Apple (все мы были в положении, обвиняющем большую рыбу в наших собственных ошибках, верно?)

... и да, я пробовал с GDB и LLDB. Результат был тот же - что может указывать на что-то.

Я пытался создать минималистичный образец, но он просто работал (действительно);)

Спасибо

Ответы [ 3 ]

7 голосов
/ 22 октября 2011

У вас есть NSZombiesEnabled?У нас была та же проблема, и мы «решили» ее, отключив NSZombies.

«Продукт» -> «Схема» -> «Редактировать схему» -> «Диагностика» -> Снимите флажок «Включить объекты-зомби»

Я не уверен, почему не вызывается dealloc, когда включены NSZombies (я уверен, что он вызывался до ARC).

1 голос
/ 29 марта 2014

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

Если вы используете блоки:

  1. Убедитесь, что SELF не появляется внутри блока.
  2. Если вам нужно использовать SELF внутри блока, используйте слабую ссылку.
  3. Убедитесь, что в блоке нет макросов, которые могут ссылаться на себя (например, NSAssert).
1 голос
/ 15 февраля 2013

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

Я также согласен с тем, что до ARC в этом случае вызывался dealloc.

После многих тестов выясняется, что dealloc не вызывается при использовании iOS 5.x (устройство или симулятор).

но он снова вызывается (с включенными зомби) в iOS 6.x (устройство или симулятор)

Я не знаю, вызвано ли это изменение ошибкой в ​​ios5, которая была исправлена ​​в ios6, или функцией, введенной и откаченной.

Надеюсь, это поможет ...

...