Подтвердить что ты не робот

В чем разница между свойством readwrite и неатомным свойством присваивания?

Я видел readwrite на int, BOOL и так далее, как неатомический, присваивать.

Я немного смущен этим. Я знаю, что на не-родных объектах мы обычно делаем неатомические, сохраняем.

4b9b3361

Ответ 1

Вот короткий ответ:

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

readwrite vs readonly определяет, имеет ли синтезированное свойство синтезированный аксессуар или нет (readwrite имеет setter и является значением по умолчанию, readonly does not).

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

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

Ответ 2

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

Ответ 3

После прочтения столь многих статей, сообщений SO и демонстрационных приложений, чтобы проверить атрибуты свойств Variable, я решил объединить все данные атрибутов

  • atomic//default
  • неатомической
  • strong = сохранить//по умолчанию
  • weak = unsafe_unretained
  • сохранить
  • присваивать //default
  • unsafe_unretained
  • Копия
  • только для чтения
  • readwrite//default

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

Измененные атрибуты свойств или модификаторы в iOS

  • сохранить = сильный
    • он сохраняется, старое значение освобождается и назначается
    • Сохранить указывает, что новое значение должно быть отправлено - получить при назначении и отправленное старое значение -release
    • сохранить то же самое, что и сильный.
    • apple говорит, что если вы напишете, сохраните, он будет автоматически преобразован/работает как сильный.
    • методы, такие как "alloc", включают неявное "сохранение"

Пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. правопреемником
    • назначает значение по умолчанию и просто выполняет присвоение переменной
    • assign - это атрибут свойства, который сообщает компилятору, как синтезировать реализацию средства установки свойств.
    • Я бы использовал назначение для примитивных свойств C и слабый для слабых ссылок на объекты Objective-C.

Пример:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. только для чтения

    • Объявление вашего свойства, поскольку вы только что указываете компилятору, что он автоматически не генерирует метод установки.
    • Указывает, что свойство доступно только для чтения.
    • Если вы укажете только для чтения, в блоке @implementation требуется только метод getter. Если вы используете директиву @synthesize в блок @implementation, синтезируется только метод getter. Более того, если вы попытаетесь присвоить значение с помощью синтаксиса точек, вы получаете ошибку компилятора.

Пример:

@property (nonatomic, readonly) NSString *name;

@synthesize name;
  1. чтение и запись
    • сгенерированы сеттеры и получатели.
    • Указывает, что свойство должно рассматриваться как чтение/запись.
    • Этот атрибут по умолчанию.
    • В блоке @implementation требуются как метод getter, так и setter. Если вы используете директиву @synthesize в реализации блок, методы геттера и сеттера синтезируются.

Пример:

@property (nonatomic, readwrite) NSString *name;

@synthesize name;