Я потратил некоторое время на отладку странной проблемы с ARC и пользовательскими функциями dealloc.
- Я подклассифицирую
NSOperation
класс
- Я установил блок завершения для этой операции
- На операцию ссылается сильное свойство очень плоский объект (без методов, автоматических иваров, два сильных свойства), позволяющий вызвать этот объект
DataRequest
- следуя всем рекомендациям, блок завершения использует только слабые ссылки на локальные объекты (включая саму операцию)
- ни компилятор, ни анализатор не генерируют никаких проблем
DataRequest
содержит ТОЛЬКО ссылку на сгенерированную мной операцию и уничтожается в блоке завершения операции. Он ВСЕГДА уничтожен (его dealloc
всегда выполняется)
- Моя операция имеет пользовательский
dealloc
. У меня только один вызов NSLog.
... и проблема:
Если я запускаю это в отладчике, точка останова в dealloc никогда не будет достигнута, сообщение журнала никогда не появится. В первую очередь я думал, что операция протекает.
Если я запускаю это на инструментах, все в порядке, системная консоль печатает сообщение, а инструмент Allocations сообщает об освобождении операции из правильного снимка стека, включая пользовательский dealloc. Утечек не обнаружено.
Я уверен на 100%, что использую одни и те же настройки компилятора для отладки и для профилирования.
Самое запутанное в конце: если я создаю пользовательскую версию [DataRequest dealloc]
и добавляю к ней self.operation = nil;
- все отлично работает даже из отладчика.
У кого-нибудь есть подсказки, какие опции компоновщика компилятора пытаются увидеть разницу? может ли это быть ошибкой в инструментах Apple (все мы были в положении, обвиняющем большую рыбу в наших собственных ошибках, верно?)
... и да, я пробовал с GDB и LLDB. Результат был тот же - что может указывать на что-то.
Я пытался создать минималистичный образец, но он просто работал (действительно);)
Спасибо