Хотел бы я когда-нибудь использовать какие-либо атрибуты @property, кроме «retain» и «nonatomic» для переменных пользовательского интерфейса? - PullRequest
2 голосов
/ 26 июля 2010

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

@property (retain, nonatomic) IBOutlet UILabel *lblStatus;

Я все еще знакомлюсь с этими типами атрибутов и тем, что они значат, но обнаружил, что эти два атрибута позволяют мне достигать своих целей.Хотел бы я когда-нибудь использовать какие-либо атрибуты @property, кроме "retain" и "nonatomic", для переменных пользовательского интерфейса?

Заранее спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 26 июля 2010

ПРИМЕЧАНИЕ: я пропустил ссылку на переменные пользовательского интерфейса в вопросе, поэтому этот ответ является более общим обсуждением.

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

  • copy - Используйте это в ситуациях, когда вы не хотите, чтобы последующее изменение данных было «подобрано» вашим классом. Другими словами, когда вы хотите получить полный контроль над данными после их передачи. Иногда это желательно, иногда нет. Такие классы, как NSString и UIColor, часто используются через свойства с атрибутом copy. Мой ответ здесь дает немного больше информации.
  • assign - Вы используете это с примитивными типами, такими как int. Вы не можете сохранить или скопировать int или float, потому что они не являются объектами, поэтому у вас есть для использования assign. (Кроме того, вы не должны и не можете освобождать эти переменные в своем методе dealloc.) Это также верно для структур C, которые не охватываются системой подсчета сохранений Objective-C.
  • assign особый случай - иногда вы используете assign даже с объектами, потому что вы хотите избежать сохранить циклы . Посмотрите на заголовок для UITableView, например. Вы заметите, что свойство delegate объявлено так: @property(nonatomic, assign) id<UITableViewDelegate> delegate. Свойства делегата всегда должны быть объявлены с assign, и то же самое применяется в некоторых других ситуациях, хотя вы вряд ли столкнетесь с ними очень скоро.
  • nonatomic - Это говорит компилятору, что свойство предназначено только для доступа из одного потока, и поэтому оно может пропустить некоторый код, который в противном случае замедлил бы вашу программу (потенциально значительно). Итак, правило здесь таково: если свойство будет или может быть доступно из нескольких потоков, вы должны , а не объявить его как nonatomic (atomic является значением по умолчанию). Обратите внимание, однако, , что сделать свойства атомарными ни в коем случае не достаточно, чтобы сделать ваш поток кода безопасным. Это еще одна и гораздо более сложная тема.
2 голосов
/ 26 июля 2010

ПРИМЕЧАНИЕ. Этот ответ больше относится к элементам пользовательского интерфейса в целом.

Да, есть другая ситуация, когда вы захотите использовать макрос «назначить» вместо «сохранить» («Назначить» пока используется по умолчанию, но вы получаете предупреждение во время компиляции, если не указали его явно)

Apple дает хороший пример этого в одном из своих руководств: Advanced UITableViewCell

Они только «присваивают», чтобы избежать сохранения цикла. (каждое представление сохраняет другое, поэтому их нельзя освободить).

1 голос
/ 10 октября 2012

(retain) обычно используется для переменных экземпляра, а assign будет использоваться для делегатов и примитивных типов данных, таких как bool, int

1 голос
/ 26 июля 2010

Ответ НЕТ.Причиной этого является причина, почему мы используем неатомные и сохранить.

Из руководство по управлению памятью"Объекты в файле пера создаются с счетом сохранения 1 и затем автоматически высвобождаются. По мере восстановления иерархии объектов UIKit восстанавливает соединения между объектами с помощью setValue:forKey :, который использует доступный метод установки или сохраняет объект по умолчанию, если метод установки недоступен. Это означает, что (при условии, что вы следуете шаблону, показанному в «Розетки»), любой объект, для которого у вас есть розетка, остается действительным. "

Итак, мы предоставляем этот установщик просто для соответствия поведению по умолчанию.

Да, можно объявить сеттер другими способами, но, по крайней мере, я не нашел причин для этого.Если мы используем assign вместо retain, то нет гарантии, что объекты останутся действительными.А управление памятью в iPhone уже критично, и, очевидно, я не хочу делать его более критичным, игнорируя соглашение.

- изменить
Ответ НЕТ только для переменных пользовательского интерфейса, то есть для IBOutlets.Не смущайтесь.Другие атрибуты необходимы в других случаях, как объяснено в других ответах.

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