Лучше ли делать так, чтобы члены-члены оставались по сравнению с присваиванием - PullRequest
1 голос
/ 06 января 2012

В моем пользовательском UIViewController есть переменные-члены, которые определены как 'assign' (а не 'retain') следующим образом:

@property (nonatomic, assign) UIButton* mSkipButton;

В моем методе loadView я установил переменную типа var.m, например, self.mSkipButton, для автоматического освобождения типа переменной. Затем я присоединяю его к представлению моего контроллера, по существу, имеющему счетчик ссылок на представления, и освобождаю его по мере необходимости.

Это касается меня, однако, что у меня есть указатель, хранящийся в моем элементе var, и что он может ссылаться на освобожденную память, если в какой-то момент число уменьшается. Не лучше ли вместо этого объявить переменную как 'retain', а затем в методе viewDidUnload освободить член var (или просто установить его равным nil для освобождения и убедиться, что у меня там нет адреса)?

В качестве альтернативы, я мог бы просто установить член var в nil в viewDidUnload и не сделать его сохраняемой переменной?

Ответы [ 2 ]

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

Лучше бы вместо этого объявлять переменную как 'retain', а затем в viewDidUnload ...?

Да, использовать retain - хороший инстинкт.В viewDidUnload вы, как правило, просто устанавливаете его на nil через установщик ivar: self.ivar = nil;

Мне проще явно знать и управлять кодовыми зависимостями объекта, чем иметь дело с проблемами, связанными ск использованию assign.Вы можете полностью избежать проблем с удержанием неуправляемой ссылки.

Можно утверждать, что assign здесь обычно бывают хорошими (и это в некоторых случаях), но использование assign может усложнить графы объектов ивладение для всех, кто работает с классом.По мере роста сложности программы (и зависящих от изменений библиотек) становится все труднее отслеживать время жизни неуправляемых ссылок.Вещи имеют тенденцию ломаться или работать по-разному на разных аппаратных и программных комбинациях.Попытка управлять временем жизни неуправляемого объекта через сложную программу или в параллельном контексте - это злоупотребление собой.Гарантирование определенного и предсказуемого поведения / операции уменьшает количество ошибок.

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

Это свойство, а не «член var» (известный в Objective-C как переменная экземпляра или ivar .)

Семантика свойства зависит от того, как это свойство будет использоваться. Вообще говоря, вы хотите, чтобы ваши свойства сохранялись в течение всего срока службы вашего объекта. Если свойство подключено IBOutlet, это будет сделано для вас загрузчиком NIB; в противном случае вы должны быть явными и использовать атрибут retain или copy в свойстве.

Для объектов, которые, как ожидается, будут владеть вашим объектом, свойство всегда должно быть помечено assign, чтобы избежать цикла сохранения. Например, объект обычно владеет любым объектом, для которого он выступает в качестве делегата (обычно, но не всегда - в каждом правиле CS есть исключение.)

...