Сохранение указателей на подпредставления - PullRequest
0 голосов
/ 29 января 2012

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

Какой тип @property необходим для такого случая?Я предполагаю, что установка свойства retain не очень хорошая идея, так как основной вид уже сохраняет его?Это должно быть assign?

Или использование @property здесь совершенно не нужно, если только вы не планируете переназначить его позже или ссылаться на него точечной нотацией?

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Рассмотрим эти две вещи:

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

  2. Основная идея управления памятью в Objective-C состоит в том, что вы беспокоитесьо сохранении объектов, которые вы используете, и позволите другим объектам беспокоиться об объектах, которые они используют.

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

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

2 голосов
/ 29 января 2012

Вы можете использовать либо retain, либо assign.

Конечно, если вы используете retain, вы должны установить свойство на nil или освободить его объект в viewDidUnload и dealloc.

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

Если вы используете assign, вам не нужно устанавливать для свойства nil в viewDidUnload и dealloc (хотя это будет хорошей практикой). Однако к тому времени, как вы получите viewDidUnload, представление уже было освобождено, поэтому вы не сможете использовать его в этот момент для другой очистки. Вместо этого вы должны переопределить didReceiveMemoryWarning, чтобы выполнить очистку перед вызовом [super didReceiveMemoryWarning].

В iOS 5.0 вы можете выполнить очистку в viewWillUnload вместо переопределения didReceiveMemoryWarning.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...