2012-06-21 2 views
5

У меня есть быстрый вопрос о ARC в iOS. (Извините, что я задал так много таких вопросов, но я просто смущен в отношении управления памятью.). Важно отметить, что я никогда не использовал старую систему обслуживания памяти (retain, release, assign ... и т. Д.), Поэтому я не знаю, что означают эти термины.Когда сильные свойства будут выпущены в ARC в iOS?

Прямо сейчас я смущен относительно того, что мне нужно сделать, чтобы убедиться, что сильные свойства будут выпущены должным образом. Например, предположим, что я создаю школьное приложение, а мой объект School содержит сильные ссылки на свойства 5 различных объектов Child (не в массиве). Каждый объект Child имеет сильный указатель (свойство) на объект Book.

Если я удалю один из объектов Child из своей школы (скажем, сделав его свойство = nil или изменив мое свойство, чтобы указать на новый объект), будет ли его правильно выпущен Book? Что мне нужно сделать, чтобы убедиться, что это так? Нужно ли писать self.myBook = nil в методе dealloc? Что, если Child был контроллером вида, мне нужно было бы написать self.myBook = nil в методе viewDidUnload?

Я ориентируюсь только на iOS 5 (и выше), поэтому старый способ управления памятью для меня не имеет большого значения.

+0

Предлагаю вам прочитать следующее: http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

Спасибо за предложение. Я посмотрю на это. – Nosrettap

ответ

5

Если удалить один из Child объектов из моей школы (например, сделав его property = nil, или изменив свою собственность, чтобы указать на новый объект), будет его Book быть правильно освобожден?

Да, он будет выпущен до тех пор, пока нет других сильных ссылок на него.

Что мне нужно сделать, чтобы убедиться, что это так?

Ничего особенное: ARC будет уменьшать счетчик ссылок объекта при установке ссылки на этот объект в nil, видит, что объект больше не ссылается, и приступить к его удалению. Он достаточно умен, чтобы иметь дело с элементами, на которые ссылается удаляемый объект, рекурсивно, поэтому вы не собираетесь утечки какой-либо памяти.

Одна вещь, вы должны беспокоиться о циклических ссылок: если ваш Book имеет сильную обратную ссылку на Child, либо сделать эту ссылку weak, или снимите его в то же время, как вы установите ссылку на Book в nil (второй вариант подвержен ошибкам, и поэтому не рекомендуется).

+0

Не могли бы вы сказать, что, по большей части, единственный раз использовать «слабые свойства» для торговых точек и избегать круговых зависимостей? – Nosrettap

+0

@ Nosrettap Избегание круговых ссылок и в некоторой степени кеширование - это два «зонтичных случая», охватывающих использование слабых свойств. Важным частным случаем, о котором стоит упомянуть отдельно, являются свойства, которые представляют делегаты: за заметным исключением из «CAAnimation» все свойства делегата слабы, чтобы избежать создания циклов сохранения. – dasblinkenlight

+0

Если есть ссылочный цикл, он не может «очистить его в -dealloc», потому что dealloc никогда не будет вызываться! (Если это не dealloc метода, владеющего обоими членами цикла) –

Смежные вопросы