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