4

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

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

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

Спасибо,

Kurt

ответ

4

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

Лично я считаю, что это хромая причина, но это причина, которая была дана.

0

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

3

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

+0

Если ваша цель развертывания включает iOS 4, то вы не сможете использовать слабые указатели; они будут 'unsafe_unretained'. –

+0

Хорошая точка. Хорошо сделано для фактической подачи ошибки на этом, вместо того, чтобы просто позволить ему смутно беспокоить вас, как я. – jrturton

3

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

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

из документации, о слабой (сеттер семантике)

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

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

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

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

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