Что означает свойство "Nonatomic"?

Что означает "неатомический" в этом коде?

@property(nonatomic, retain) UITextField *theUsersName;

В чем разница между атомными и неатомическими?

Спасибо

Ответ 1

Взгляните на Apple Docs.

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

Если вы используете значение по умолчанию (которое равно atomic; для этого не было ключевого слова, но там теперь), затем методы @synthesize d используют блокировку на уровне объекта, чтобы обеспечить последовательное сериализацию нескольких операций чтения/записи в одно свойство. Как отмечают Apple, это не означает, что весь объект является потокобезопасным, но индивидуальное свойство читает/записывает.

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

Ответ 2

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

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

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

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

  • атомное
    • Atomic означает, что только один поток обращается к переменной (статический тип).
    • Atomic является потокобезопасным.
    • Но он медленный в производительности.
    • Атомное поведение по умолчанию.
    • Атомарные аксессоры в среде, не содержащей мусора (то есть при использовании сохранения/освобождения/авторекламы), будут использовать блокировку, чтобы гарантировать, что другой поток не будет мешать правильной настройке/получении значения.
    • это не ключевое слово.

Пример:

@property (retain) NSString *name;

@synthesize name;
  1. неатомической
    • Nonatomic означает, что несколько потоков обращаются к переменной (динамический тип).
    • Nonatomic - небезопасный поток.
    • Но это быстро работает.
    • Nonatomic не является поведением по умолчанию; нам нужно добавить неатомическое ключевое слово в атрибуте свойства.
    • это может привести к неожиданному поведению, когда два разных процесса (потоков) получают доступ к одной и той же переменной одновременно.

Пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;

Ответ 3

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

Ответ 4

В многопоточной программе атомная операция не может быть прервана частично, тогда как неатомные операции могут.

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

Ответ 5

Если вы укажете "атомный", сгенерированные функции доступа имеют дополнительный код для защиты от одновременных обновлений.

Ответ 6

Обычно атомарное означает, что запись/чтение в свойство происходит как одна операция. Atomic_operation

Ответ 8

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

@property (nonatomic, retain)  NSString *myString;

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

Ответ 9

Один для нескольких потоков. One isnt