2016-01-28 4 views
3

Этот вопрос возник ко мне при чтении this.Установляет ли ARC свойства экземпляра ссылочного типа до нуля до освобождения?

Мой вопрос не является ссылкой на изображении ниже:

enter image description here

После джон установлен в ноль, Person экземпляр больше не имеет более сильную ссылку и, следовательно, будет освобождаться. Но Apartment имеет две сильные ссылки и один из которых находится у объекта на Person экземпляре, который скоро будет освобожден. Я считаю, эта сильная ссылка продолжает оставаться после освобождения и выходит за пределы кода.

Таким образом, установка unit14A к nil удалит только один сильный ссылку на Apartment инстанции и оно не должно быть высвобождены как это было бы еще одна сильная ссылка в связи с выше случае.

Но, как говорится в документе, Apartment экземпляр незамедлительно освобожден. Для меня это может произойти только в том случае, если во время Person экземпляр освобождения устанавливает квартиру собственности на nil, тем самым удаляя эту сильную ссылку на экземпляр Apartment. Но я не мог найти документацию, чтобы проверить это.

Итак, как экземпляр квартиры освобождается? Что случилось с сильной ссылкой на собственность квартиры с экземпляром Person?

Может кто-нибудь помочь мне понять это?

+0

http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_arc – matt

ответ

1

Ваша интуиция верна. Когда объект освобождается из-за ARC, все сильные ссылки, которые он удерживает, сначала убираются - по существу они установлены на nil, но на практике реализация может отличаться.

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

Все детали можно найти в Clang documentation.

НТН

2

Жизнь объекта зависит от это счетчик ссылок, а не какой-либо фактической указатель на объект.

Сильная ссылка - это способ говорить, нет никакой разницы между сильной и слабой ссылкой, они просто указатели. Разница заключается в том, что при создании сильной ссылки счетчик ссылок объекта, на который указана в приращении, и при удалении счетчик ссылок уменьшается. Когда счетчик ссылок объекта станет нулевым, объект будет освобожден.

5

Объекты Objective-C подсчитываются по ссылке, что означает, что для каждого объекта система отслеживает, сколько других объектов содержит ссылку на нее. Это номер объекта . Два специальных сообщения, retain и release, используются для поддержания отсчета ссылок за сценой. Когда счетчик ссылок опускается до нуля, система освобождает объект.

ARC обеспечивает «волшебство», чтобы сделать работу подсчета ссылок декларативным способом.Компилятор знает все сильные ссылки в коде, так что, когда вы делаете это

myStrongRef = nil; 

компилятор спокойно вставляет вызов release перед назначением:

[myStrongRef release]; 
myStrongRef = nil; 

мне [открепление из Apartment] может произойти только в том случае, если на момент удаления Person экземпляр освобождает его квартиру до nil, тем самым удаляя эту сильную ссылку на экземпляр Apartment.

Установка сильной ссылки на nil один способ взлома сильной ссылки. Этого достаточно, но это необязательно. Важное значение для установки сильной ссылки на nil - это не сам настрой, а то, что происходит непосредственно перед ним: экземпляр, на который ссылается сильная ссылка, получает сообщение release, в котором указывается, что он уменьшает счетчик ссылок. Именно это ARC делает за сценой для вас: он отправляет сообщение release в Apartment, не задавая Person ссылкой на nil.

Как удалить Apartment экземпляр? Что случилось с сильной ссылкой от объекта недвижимости Person?

После того, как сильная ссылка от Person послала его release сообщений для Apartment, что сильная ссылка исчезает. Фактический указатель может быть установлен на адрес Apartment, но об этом никто не заботится, потому что сам Person недостижим.

0

Очевидно, что не до освобождение, но во время освобождения.

Когда счетчик ссылок объекта обращается в нуль, начинается процесс освобождения. Объект отмечен как «освобождение». В этот момент объект будет die (в отличие от Java, где он может быть восстановлен). Если объект помечен как это, он не может быть назначен слабым ссылкам (они остаются ноль) или сильным ссылкам.

Затем вызывается dealloc, то есть методы dealloc, которые вы написали. После этого сильные ссылки устанавливаются на nil, уменьшая количество ссылок, затем удаляются связанные объекты, и, наконец, память для объекта удаляется.