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

Довольно простой вопрос в двух частях.

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

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


person christopherdrum    schedule 18.02.2013    source источник
comment
Связанное чтение: Подразумевает ли IBOutlet слабость?   -  person jscs    schedule 18.02.2013
comment
Ах, идеально. Я чувствовал, что достаточно изучил документы Apple, но ответ лежит именно там.   -  person christopherdrum    schedule 18.02.2013


Ответы (2)


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

2) Да

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

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

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

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

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

person newacct    schedule 18.02.2013
comment
подумайте о том, сохраняется ли оно чем-то другим или нет, я бы скромно сказал, что это именно то, о чем мы должны думать. На самом деле документация Apple, указанная в приведенной выше ссылке, явно рекомендует сохранять слабые ссылки на IBOutlets, которые не находятся на верхнем уровне иерархии объекта. - person christopherdrum; 19.02.2013