2013-02-18 5 views
3

Довольно простой вопрос в двух частях.Зачем устанавливать удержание на @property для subviews?

  1. Если вид сохраняет подвиды, и мы создаем иерархию вида в Interface Builder, где взгляды вложенная в других, почему свойство IBOutlet для вложенных подобозрения должно быть установлено, чтобы сохранить? Не будет ли быть приемлемым параметром для этих свойств subview?

  2. У меня есть подкласс UIView, который добавляет несколько подвид к себе при инициализации. Чтобы захватить ссылки на определенные подпункты, для этой потребности будет достаточно @property (nonatomic, assign), правильно? Например, основной UIView добавляет подзапрос игрока, а затем хочет поговорить с этим счетом игрока, чтобы обновить его. Эта ссылка должна быть назначена, так как соответствующее представление автоматически сохраняется классом UIView, правильно?

+1

Связанные чтения: [Является ли IBOutlet слабым?] (Http://stackoverflow.com/q/10308792) –

+0

Ах, отлично. Я чувствовал, что я налил документы Apple достаточно, но там лежит ответ. – christopherdrum

ответ

2

1) Этого не должно быть. assign в порядке. Почему вы думаете, что у вас есть, чтобы использовать retain?

2) Да

Кстати, вы используете ARC? Если это так, используйте weak вместо assign (пожалуйста, не спрашивайте, почему, это хорошо объясняется в каждом углу переполнения стека и в Интернете в целом).

+0

Текущий проект не является ARC, поэтому я задал вопрос конкретно в контексте сохранения/присвоения. Спасибо, что решили подтвердить слабый/сильный со мной. Я не думал, что мне нужно использовать удержание, но я понял, что привык делать это и не могу объяснить, почему. Когда я начал спрашивать себя, я понял, что мне нужно подтверждение от сообщества в целом. С другой стороны, я чувствую, что разработчикам постоянно говорят (через онлайн-учебники, например), чтобы выпустить IBOutlets, что подразумевает сохранение, которое имеет обратную связь, что каждый должен всегда сохранять каждый IBOutlet. – christopherdrum

+0

Любое интерактивное учебное пособие, в котором говорится о том, что вы всегда * выпускаете что-то, не следует доверять. Любое свойство * сохранено * должно быть выпущено, как и любой сохраненный IBOutlet. IBOutlets можно использовать для других вещей помимо представлений, и если это объект верхнего уровня, он будет немедленно освобожден без сохранения свойства. – borrrden

1

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

Общим соглашением является сохранение переменных экземпляра, если только это не необходимо (например, для делегатов). Если мы пойдем по пути, говоря: «О, нам не нужно сохранять эту переменную экземпляра, потому что она сохраняется здесь, о, нам нужно сохранить эту другую, потому что она не сохраняется и т. Д.», Тогда мы заканчиваем тем, что очень беспорядочно управление памятью, где каждый раз, когда мы добавляем переменную экземпляра, мы должны подумать о том, сохраняется ли она чем-то другим или нет; и затем каждый раз, когда мы его используем, мы должны помнить, решили ли мы сохранить это или нет. Именно такой кошмар управления памятью управляет правилами управления памятью.

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

+0

«подумайте о том, сохранилось ли что-то еще или нет». Я смиренно утверждаю, что это именно то, о чем мы должны думать. Фактически документация Apple, указанная в ссылке выше, явно рекомендует сохранять слабые ссылки на IBOutlets, которые не находятся на верхнем уровне иерархии сохранения объекта. – christopherdrum