2012-12-24 6 views
1

Я прочитал много статей, но когда я сделал практически, я думаю, что упускаю что-то.Должен ли я использовать nil в ARC

У меня есть приложение, в котором я устанавливаю одноэлементный объект для модуля, который представляет по отношению к другому виду controller.This одноплодного объекта других ребенок создания экземпляра objects.After завершая задачу я являюсь , отказавшим контроллер и настройкой ноля для Синглтона объекта. Но в инструментах показано много объектов, созданных моим моим модулем, все еще alive.

Мой первый вопрос: - отклоняет диспетчер для освобождения всего его дочернего объекта или нет? или я должен явно установить его в nil.

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

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

Есть еще несколько объектов, которые показываются инструментом в списке объектов, имеют имя <x06...> или malloc, которые выделяются моими методами кода. Должен ли я беспокоиться об этих распределениях объектов?

+1

Вы должны уточнить, если вы говорите о свойствах или переменных экземпляра. – Till

+0

@ До тех пор, пока они не являются свойствами, а две или три являются переменными экземпляра – codester

ответ

0

отклоняя DEALLOCATE все его дочерний объект или нет контроллер?

Не по существу, нет. Это зависит. Объект освобождается после того, как в приложении нет более сильных ссылок на него.

Итак, если у вас есть сильная переменная экземпляра, ссылающаяся на ваш контроллер, отклонение ее не приведет к освобождению, потому что у вас все еще есть сильная ссылка на нее. Однако если после этого вы установите его на nil, и нет никаких других сильных ссылок на объект, , то он будет освобожден.

С другой стороны, если у вас нет четкой ссылки на него в вашем коде, единственная сильная ссылка на него - от контроллера представления представления, поэтому, когда это отклоняет его, не будет никаких сильных ссылок на это в вашем приложении, поэтому оно будет освобождено после его увольнения.

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

Вы получаете здесь свою терминологию. Нет такой вещи, как «супер-родитель». Есть суперклассы и супервизоры, но неясно, если вы имеете в виду любой из них. Если у вас есть постоянные объекты, от которых вы не можете избавиться, отправьте код, который вы используете.

+0

спасибо за ваш ответ, «super parent» я имею в виду отношение сдерживания свойств и переменную экземпляра, в которой они определяют. Фактически все мои объекты в этом модуле исходят от singleton объект, и они не имеют отношения к объектам в моем приложении, но проблема заключается в том, что они не получают dealloccated, когда я устанавливаю этот объект singelton на nil.Do у вас есть идея, почему они не освобождают? – codester

1

is dismissing a controller deallocate all its child object or not? or i have to explicitly set it to nil.

Да он вызывает освобождение. И после этого назначение nil им просто вещь.

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

И release -ing не означает, что эта память будет доступна с этого момента времени. Если он остается там довольно долгое время, и если ОС не сможет найти достаточную память, чем эти release -d памяти, взятые ОС.

2

Первый вопрос: Нет, это просто позвонить релиз: ссылка отсчитывать на 1, но dealloc, когда счетчик ссылок равен 0.

Просто проверить, кто принимает рефов на объекты, которые живут после dissmissing контроллера.

Этот контроллер должен принимать все ссылки на все объекты, которые будут освобождены от него, и только этот контроллер больше никто.

Об установке нуля в ARC. Да, это хорошая практика. Например, все выходы автоматически (при перетаскивании его из IB в код с правой кнопкой) создаются как (неатомные, слабые). Слабый - означает, что он будет установлен на nil, когда объект освобожден.

Кроме того, о ARC, Nils и другие: http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

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