Что означает свойство "Неатомное"? - PullRequest
141 голосов
/ 04 мая 2009

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

@property(nonatomic, retain) UITextField *theUsersName;

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

Спасибо

Ответы [ 9 ]

264 голосов
/ 05 мая 2009

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

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

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

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

46 голосов
/ 21 марта 2013

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

  1. атомарный // по умолчанию
  2. неатомической
  3. strong = сохранить // по умолчанию
  4. слабый = unsafe_unretained
  5. 1012 * сохранить *
  6. назначить // по умолчанию
  7. unsafe_unretained
  8. копия
  9. 1020 * только для чтения *
  10. readwrite // по умолчанию

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

Атрибуты переменных свойств или модификаторы в iOS

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

Пример:

@property (retain) NSString *name;

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

Пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;
12 голосов
/ 05 мая 2009

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

9 голосов
/ 04 мая 2009

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

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

8 голосов
/ 04 мая 2009

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

6 голосов
/ 04 мая 2009

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

2 голосов
/ 13 июля 2012

Вы можете справиться с этими вещами, прочитав статью ниже.

Threading Объяснено с целью неатома

неатомный - не безопасен для потоков

atomic - Thread Safe - это атрибут свойства по умолчанию.

0 голосов
/ 14 апреля 2012

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

@property (nonatomic, retain)  NSString *myString;

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

0 голосов
/ 04 июня 2009

Один для многопоточности. Один не

...