Зумби против нулевого объекта

В цели C мы можем отправить сообщение объекту nil.

Объект Zoombie (висячий указатель) - это объект, который указывает на объект, память которого была освобождена, т. е. не указывающий на какое-либо допустимое место в памяти.

В этом случае ссылка содержит не ноль, а неверный адрес.

Это причина аварии?

Если мы попытаемся отправить сообщение выпущенному объекту, в этом случае наша программа также выйдет из строя, потому что объект может быть не равен нулю и может иметь адрес памяти. Вот почему для NON - ARC в некоторых случаях мы также устанавливаем obj = nil после отправки сообщения о выпуске в **dealloc()**

Я понимаю эту концепцию?

Спасибо,


person srus2017    schedule 24.04.2018    source источник


Ответы (1)


Вы путаете две очень разные вещи. Зомби - это не висячий указатель. Это то, что вы создаете в ситуации отладки, чтобы отследить висящий указатель (т.е. для отладки).


Висячий указатель, как я думаю, вы понимаете, возникает, когда объект A имеет ссылку на объект B, но объект B освобождается таким образом, что его счетчик сохраняемых данных уменьшается до нуля и перестает существовать.

Типичный сценарий состоит в том, что мы назначаем объекту Какао delegate, и delegate впоследствии перестает существовать. Многие свойства Какао delegate традиционно являются слабыми от дуги (assign), поэтому, если объект Какао теперь пытается связаться со своим delegate, мы можем аварийно завершить работу.

Как вы правильно сказали, решение состоит в том, чтобы присвоить nil свойству delegate, когда объект делегата перестает существовать. К счастью, этот сценарий все время становится менее вероятным, потому что Apple заменяет assign делегатов делегатами weak (arcweak) во всем Какао.

Но висячие указатели также могут возникать из-за проблем с потоковой передачей.

Сбои, вызванные висячими указателями, очень сложно отследить, потому что сбой, когда он происходит, часто происходит спустя много времени после выпуска, из-за которого указатель болтался. Зомби - это инструмент отладки, в котором нет висячих указателей. Вместо этого, когда объект перестает существовать, объект-зомби занимает его место по тому же адресу памяти. Фактически, вся наша память теперь протекает, но это стоит того для целей тестирования, потому что мы можем отследить причину нашего сбоя. Объект-зомби делает только одно: он кричит, если к нему прикоснутся, и сообщает, какой объект он заменил. Таким образом, мы можем в надлежащем порядке обнаружить попытку отправить сообщение посредством того, что могло бы быть висящим указателем.

person matt    schedule 24.04.2018