Как использовать свойства в Objective-C? - PullRequest
7 голосов
/ 02 марта 2011

Когда мне следует использовать свойства nonatomic, retain, readonly и readwrite в Objective-C?

Например:

@property(nonatomic, retain) NSObject *myObject;

Если я использую nonatomic и retain, означает ли это, что объект будет сохранен?

Ответы [ 3 ]

10 голосов
/ 02 марта 2011

Прежде всего, я хотел сделать комментарий Дэвида Гелхара полным ответом. Модификаторы atomic и nonatomic не имеют ничего общего с безопасностью потоков. См. этот вопрос для более подробной информации в этом пространстве.

Остальные перечисленные вами пункты можно решить относительно просто. Я кратко нажму на них и укажу вам документацию о модификаторах свойств, если вы хотите больше.

atomic против nonatomic в первую очередь гарантирует, что полные значения возвращаются из синтезированных геттеров, а полные значения записываются синтезированными сеттерами.

readwrite против readonly определяет, имеет ли синтезированное свойство синтезированный метод доступа или нет (readwrite имеет установщик и используется по умолчанию, readonly - нет).

assign против retain против copy определяет, как синтезированные средства доступа взаимодействуют со схемой управления памятью Objective-C. assign является значением по умолчанию и просто выполняет присвоение переменной. retain указывает, что новое значение должно быть отправлено -retain при присвоении, а старое значение отправлено -release. copy указывает, что новое значение должно быть отправлено -copy при присвоении, а старое значение отправлено -release.

2 голосов
/ 02 марта 2011

Если вы используете nonatomic, чтение и запись свойства не будут потокобезопасными.На данный момент я не думаю, что вам следует о чем-то беспокоиться, но неатомарный доступ может быть быстрее, чем атомарный доступ, поэтому он используется здесь.

Если вы используете retain, запись всвойство приведет к тому, что исходящее значение будет освобождено, а входящее значение сохранится, поддерживая правильное владение значением на основе подсчета ссылок.

1 голос
/ 02 марта 2011

nontomic По сути, если вы говорите, что неатома, и вы генерируете методы доступа с помощью @synthesize, то, если несколько потоков пытаются изменить / прочитать свойство одновременно, может произойти сбой.Вы можете получить частично записанные значения или чрезмерно освобожденные / сохраненные объекты, которые могут легко привести к сбоям.(Тем не менее, это потенциально намного быстрее, чем атомарный метод доступа.)

atomic - поведение по умолчанию.Неатомный потокобезопасен. readonly Внешне свойство будет доступно только для чтения.

readwrite свойство будет иметь как accessor, так и setter.

assign (по умолчанию)) - Указывает, что сеттер использует простое назначение. retain - Указывает, что retain должна вызываться для объекта при назначении.Этот атрибут действителен только для типов объектов Objective-C.(Вы не можете указать сохранение для базовых базовых объектов)

copy - указывает, что копия объекта должна использоваться для назначения.Предыдущее значение отправляется сообщение о выпуске.Копирование производится путем вызова метода копирования.Этот атрибут действителен только для типов объектов, которые должны реализовывать протокол NSCopying.

...