ARC и Интерфейсный Разработчик - PullRequest
4 голосов
/ 20 марта 2012

У меня есть интересный вопрос о построителе интерфейсов и ARC.Я строю контроллер представления, который будет инициализирован с XIB.Я использую возможность конструктора интерфейса с помощью нажатий и перетаскивания для создания необходимых выходов свойств для моей xib.Это инициализирует свойство как (слабое, неатомное).Звучит хорошо для меня.

Меня отталкивает то, что такие строки, как [self setCategoryButton:nil];, автоматически добавляются в viewDidUnload.Я понял и использовал это до ARC.Однако, поскольку это слабые ссылки, не будут ли они автоматически очищаться при выгрузке представления?

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

Спасибо,

Курт

Ответы [ 4 ]

4 голосов
/ 20 марта 2012

Некоторое время назад я подал ошибку, и я получил ответ, что это преднамеренное поведение. Поскольку XCode не может проверить, что нет других сильных ссылок на представление, он не может фактически гарантировать , что слабый указатель будет автоматически очищен в -viewDidUnload. Таким образом, они проясняют это для вас.

Лично я думаю, что это неубедительная причина, но именно по этой причине.

3 голосов
/ 20 марта 2012

В iOS5 и более поздних версиях будет установлено значение nil (iOS 4 не будет автоматически обнулять слабые указатели), поэтому он используется для обеспечения безопасности в автоматически сгенерированном коде. Я сам задавался вопросом об этом, и это единственная причина, по которой я могу придумать.

3 голосов
/ 20 марта 2012

Из документации, viewDidUnload

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

Из Документации о слабых (семантика сеттера)

  • Указывает, чтосуществует слабая (не владеющая) связь с объектом назначения. Если целевой объект освобожден, значение свойства автоматически устанавливается равным nil .

Так что это очевидно.Он соответствует правилам. Это не объект, на который указывает ваше свойство, а просто аннулирование вашего свойства на основе приведенного выше правила слабости.

viewDidUnload предполагает, что это ваше слабое свойство может 'Не указывать на какой-либо объект, потому что этот объект освобожден (в зависимости от места viewDidUnload в жизненном цикле View Controller).И просто очищает его с нуля.

Это безопасно для вас, явно для слабого правила и эффективного использования памяти.Компилятор не может быть уверен, что вы позаботились о указанном объекте.Ему просто нужно обеспечить уборку.

0 голосов
/ 20 марта 2012

Поскольку свойство имеет значение weak, ссылка в вашем объекте не повлияет на счет сохранения объекта. Так что да, нет смысла устанавливать объект как ноль. По крайней мере, я так понимаю.

...