Вы путаете две очень разные вещи. Зомби - это не висячий указатель. Это то, что вы создаете в ситуации отладки, чтобы отследить висящий указатель (т.е. для отладки).
Висячий указатель, как я думаю, вы понимаете, возникает, когда объект A имеет ссылку на объект B, но объект B освобождается таким образом, что его счетчик сохраняемых данных уменьшается до нуля и перестает существовать.
Типичный сценарий состоит в том, что мы назначаем объекту Какао delegate
, и delegate
впоследствии перестает существовать. Многие свойства Какао delegate
традиционно являются слабыми от дуги (assign
), поэтому, если объект Какао теперь пытается связаться со своим delegate
, мы можем аварийно завершить работу.
Как вы правильно сказали, решение состоит в том, чтобы присвоить nil
свойству delegate
, когда объект делегата перестает существовать. К счастью, этот сценарий все время становится менее вероятным, потому что Apple заменяет assign
делегатов делегатами weak
(arcweak) во всем Какао.
Но висячие указатели также могут возникать из-за проблем с потоковой передачей.
Сбои, вызванные висячими указателями, очень сложно отследить, потому что сбой, когда он происходит, часто происходит спустя много времени после выпуска, из-за которого указатель болтался. Зомби - это инструмент отладки, в котором нет висячих указателей. Вместо этого, когда объект перестает существовать, объект-зомби занимает его место по тому же адресу памяти. Фактически, вся наша память теперь протекает, но это стоит того для целей тестирования, потому что мы можем отследить причину нашего сбоя. Объект-зомби делает только одно: он кричит, если к нему прикоснутся, и сообщает, какой объект он заменил. Таким образом, мы можем в надлежащем порядке обнаружить попытку отправить сообщение посредством того, что могло бы быть висящим указателем.
person
matt
schedule
24.04.2018