Що означає властивість "Неатомне"?


144

Що означає "неатомічний" у цьому коді?

@property(nonatomic, retain) UITextField *theUsersName;

Яка різниця між атомним і неатомним?

Дякую


3
Вибачте, забув вказати це в Objective-c (какао)

Будь ласка, прочитайте це посилання - stackoverflow.com/questions/588866 / ...
Віджаендра

Для всіх, хто читає це, у 2014 році важливо усвідомити, що багато цієї інформації є застарілою. Словом, немає жодної причини використовувати неатомічний, і по суті неправильно коли-небудь використовувати його з будь-якої причини. це давня історія. Неатомний означає "небезпечний режим потоку" і тепер (одним словом) абсолютно не має значення. Деякі коментарі тут stackoverflow.com/q/23977765/294884
Fattie

Я не погоджуюся з "невідповідним" твердженням. Якщо значення змінюється рідко і як приклад в Apple doc - прізвище. Він змінюється один раз, то використання атомного натяку - це марна витрата ресурсів, оскільки перевірки не потрібні.
Нік Тернер

Відповіді:


268

Погляньте на Документи Apple .

В основному, якщо ви говорите nonatomic, і ви генеруєте аксесуари, використовуючи @synthesize, то, якщо кілька потоків намагаються змінити / прочитати властивість одночасно, може статися неприємність. Ви можете отримати частково записані значення або перезапущені / утримувані об'єкти, що може легко призвести до збоїв. (Однак це потенційно набагато швидше, ніж атомний аксесуар.)

Якщо ви використовуєте за замовчуванням (який є atomic; раніше для цього не було ключового слова, але зараз існує ), то в @synthesizeметодах d використовується блокування об'єктного рівня, щоб забезпечити серіалізацію читання / запису в одне властивість. Як вказують документи Apple, це не означає, що весь об'єкт є безпечним для потоків , але окремі властивості читаються / записуються.

Звичайно, якщо ви реалізуєте свої власні аксесуари, а не використовуєте @synthesize, я думаю, що ці декларації не роблять нічого, крім висловлення ваших намірів щодо того, чи властивість реалізована в безпечному режимі.


7
Мені подобається ця відповідь - менш заплутана, простіша і повніша, ніж ті, що знайдені деінде!
PapillonUK

Дійсно чудовий і менш заплутаний (+1), але ви можете сказати, будь ласка, чому чому неатомний потенційно набагато швидше, ніж атомний аксесуар?
Побажання

2
@Wish Неатомні аксесуари можуть бути швидшими, тому що для запобігання одночасного читання / запису інших потоків вам потрібно тримати мютекс або виконувати інші хитрощі низького рівня, які коштують часу на процесор. Якщо ви використовуєте блокування, ви також можете заблокувати інші потоки, що також потребує часу.
Джессі Русак

1
@Rob Ви можете поставити нове запитання з цього приводу.
Джессі Русак

1
@Pratik Вибачте, це невірно. Цитата, яку ви показуєте, говорить саме те саме, що я зробив: те, що створення властивості atomicдозволяє уникнути збоїв під час доступу до окремих властивостей, але не гарантує, що об'єкт в цілому (тобто доступ до окремих властивостей, таких як імена та прізвища) буде робити. правильна річ.
Джессі Русак

46

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

  1. атомний // за замовчуванням
  2. неатомічний
  3. strong = зберегти // за замовчуванням
  4. слабкий = небезпечний_незатриманий
  5. утримувати
  6. призначити // за замовчуванням
  7. небезпечно
  8. копія
  9. лише для читання
  10. readwrite // за замовчуванням

тому нижче - докладне посилання на статтю, де ви можете знайти вищезазначені атрибути, які точно допоможуть вам. Велике спасибі всім людям, які дають найкращі відповіді тут !!

Змінні атрибути властивості або модифікатори в iOS

  1. атомний
    • Атомний означає, що лише одна нитка має доступ до змінної (статичний тип).
    • Атомний є безпечним для ниток.
    • Але це повільно у виконанні.
    • Atomic - це поведінка за замовчуванням.
    • Атомні аксесуари в не зібраному сміттям середовищі (тобто при використанні утримувати / випускати / автовипускати) використовуватимуть замок, щоб переконатися, що інша нитка не заважає правильному встановленню / отриманню значення.
    • це насправді не ключове слово.

Приклад:

@property (retain) NSString *name;

@synthesize name;
  1. неатомічний
    • Неатомні засоби означають, що декілька потоків мають доступ до змінної (динамічний тип).
    • Неатомічна нитка небезпечна.
    • Але це швидкодієздатність.
    • Неатомне НЕ є поведінкою за замовчуванням; нам потрібно додати неатомічне ключове слово в атрибут властивості.
    • це може призвести до несподіваної поведінки, коли два різні процеси (потоки) отримують доступ до однієї і тієї ж змінної одночасно.

Приклад:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

На додаток до того, що вже було сказано про безпеку різьби, неатомні властивості швидші, ніж атомні аксесуари. Зазвичай це не про що потрібно турбуватися, але пам’ятайте про це. З цієї причини генеровані основні властивості даних частково неатомічні.


9

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

Тому вам слід використовувати мутекси (або щось подібне), якщо у вас є критична операція, яка не є атомічною, і ви не хочете, щоб її переривали.


8

Якщо ви вказали "атомний", згенеровані функції доступу мають додатковий код для захисту від одночасного оновлення.



2

Ви можете отримати впоратися з цим продуктом, прочитавши статтю нижче.

Нитка Пояснюється з неатомною метою

неатомічний - Не безпечний для нитки

atomic - Thread Safe - це атрибут властивості за замовчуванням.


1
Ви впевнені, що це не навпаки? Атомні властивості є безпечними , але неатоміческіе властивості НЕ безпечні. Востаннє я перевіряв, що це було так: Р
Девід Рьонквіст

0

У «атомарних» означає , що доступ до властивості потокобезпечна. В той час як "неатоміческое" протилежний йому. Коли ви оголошуєте властивість в Objective-C властивість атомарному за замовчуванням , так що синтезовані аксессор забезпечують надійний доступ до власності у багатопотоковому середовищі - тобто значення, повернене з getter або встановленим через сеттер, завжди повністю витягується або встановлюється незалежно від того, які інші потоки виконуються одночасно. Але якщо ви оголошуєте властивість неатомічним, як нижче

@property (nonatomic, retain)  NSString *myString;

то це означає, що синтезований аксесуар для властивості об'єкта просто повертає значення безпосередньо. Ефект неатомічного атрибута залежить від середовища. За замовчуванням синтезовані аксесуари є атомними. Тож неатомічний значно швидший, ніж атомний.


-2

Один призначений для декількох ниток. Один хіба що


ІМХО: Щоб отримати будь-які результати, вам потрібно бути більш конкретними та витратити певний час на написання своєї відповіді.
Йохан Карлссон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.