Что означает "неатомический" в этом коде?
@property(nonatomic, retain) UITextField *theUsersName;
В чем разница между атомными и неатомическими?
Спасибо
Что означает "неатомический" в этом коде?
@property(nonatomic, retain) UITextField *theUsersName;
В чем разница между атомными и неатомическими?
Спасибо
Взгляните на Apple Docs.
В принципе, если вы говорите nonatomic
, и вы создаете аксессоров с помощью @synthesize
, то если несколько потоков пытаются изменить/прочитать свойство сразу, может случиться плохое. Вы можете получить частично написанные значения или перевыпущенные/сохраненные объекты, что может привести к сбоям. (Это потенциально намного быстрее, чем атомный аксессуар.)
Если вы используете значение по умолчанию (которое равно atomic
; для этого не было ключевого слова, но там теперь), затем методы @synthesize
d используют блокировку на уровне объекта, чтобы обеспечить последовательное сериализацию нескольких операций чтения/записи в одно свойство. Как отмечают Apple, это не означает, что весь объект является потокобезопасным, но индивидуальное свойство читает/записывает.
Конечно, если вы реализуете свои собственные аксессоры, а не используете @synthesize
, я думаю, что эти объявления ничего не делают, кроме выражения вашего намерения относительно того, реализовано ли свойство в потоковом режиме.
После прочтения стольких статей и статей StackOverflow и внесения демонстрационных приложений для проверки атрибутов свойств Variable, я решил собрать все данные атрибутов вместе
поэтому ниже приведена подробная ссылка на статью, в которой вы можете найти вышеупомянутые все атрибуты, которые определенно помогут вам. Большое спасибо всем людям, которые дают лучшие ответы здесь!
Пример:
@property (retain) NSString *name;
@synthesize name;
Пример:
@property (nonatomic, retain) NSString *name;
@synthesize name;
В дополнение к тому, что уже было сказано о ничтожестве, неатомные свойства быстрее, чем атомарные аксессоры. Это не то, о чем вам обычно нужно беспокоиться, но помните об этом. По этой причине свойства, генерируемые базовыми данными, частично неатомичны.
В многопоточной программе атомная операция не может быть прервана частично, тогда как неатомные операции могут.
Следовательно, вы должны использовать мьютексы (или что-то в этом роде), если у вас есть критическая операция, которая неатомна, которую вы не хотите прервать.
Если вы укажете "атомный", сгенерированные функции доступа имеют дополнительный код для защиты от одновременных обновлений.
Обычно атомарное означает, что запись/чтение в свойство происходит как одна операция. Atomic_operation
Вы можете получить доступ к этим материалам, прочитав приведенную ниже статью.
Threading Объяснение с неатомическим назначением
nonatomic - Not Thread Safe
atomic - Thread Safe - это атрибут свойства по умолчанию.
"atomic" означает, что доступ к свойству является потокобезопасным. а "неатомный" - это противоположность. Когда вы объявляете свойство в Objective-C, свойство по умолчанию является атомарным, так что синтезированные аксессоры обеспечивают надежный доступ к свойству в многопоточной среде, то есть значение, возвращаемое из получателя или заданное с помощью установщика, всегда полностью извлекается или устанавливается независимо из того, что другие потоки выполняются одновременно. Но если вы объявите свойство неатомным, как показано ниже
@property (nonatomic, retain) NSString *myString;
то это означает, что синтезированный аксессор для свойства объекта просто возвращает значение напрямую. Эффект неатомического атрибута зависит от окружающей среды. По умолчанию синтезированные аксессоры являются атомарными. Таким образом, неатомный значительно быстрее, чем атомный.
Один для нескольких потоков. One isnt