Co oznacza właściwość „Nonatomic”?

144

Co oznacza „nieatomowy” w tym kodzie?

@property(nonatomic, retain) UITextField *theUsersName;

Jaka jest różnica między atomową a nieatomową?

Dzięki

swiftBoy
źródło
3
Przepraszamy, zapomniałem określić, że to jest w Objective-c (cocoa)
Przeczytaj również ten link - stackoverflow.com/questions/588866/…
Vijayendra
Dla każdego, kto to czyta, ważne jest, aby w 2014 roku zdać sobie sprawę, że wiele z tych informacji jest bardzo nieaktualnych. Jednym słowem, nie ma powodu, aby kiedykolwiek używać elementów nieatomowych i zasadniczo niewłaściwe jest używanie go z jakiegokolwiek powodu. to historia starożytna. Nieatomowy oznacza „tryb niebezpieczny dla wątków” i jest (jednym słowem) całkowicie nieistotny. Kilka komentarzy tutaj stackoverflow.com/q/23977765/294884
Fattie
Nie zgodziłbym się ze stwierdzeniem „nieistotne”. Jeśli wartość zmienia się Rzadko i jako przykład w dokumencie Apple jest nazwisko. Zmienia się raz, a użycie atomowej wskazówki jest stratą zasobów, ponieważ kontrole nie są potrzebne.
Nick Turner
Oto odpowiedź stackoverflow.com/a/32942413/1961064
Grigori Jlavyan

Odpowiedzi:

268

Spójrz na Apple Docs .

Zasadniczo, jeśli powiesz nonatomici wygenerujesz metody dostępu za pomocą @synthesize, to jeśli wiele wątków spróbuje zmienić / odczytać właściwość jednocześnie, może się zdarzyć zło. Możesz uzyskać częściowo zapisane wartości lub nadmiernie zwolnione / zachowane obiekty, co może łatwo doprowadzić do awarii. (Jest to jednak potencjalnie dużo szybsze niż akcesorium atomowe).

Jeśli używasz wartości domyślnej (czyli atomic; kiedyś nie było do tego słowa kluczowego, ale jest teraz ), @synthesizemetody d używają blokady na poziomie obiektu, aby zapewnić, że wiele odczytów / zapisów do jednej właściwości jest serializowanych. Jak wskazuje dokumentacja Apple, nie oznacza to, że cały obiekt jest bezpieczny dla wątków , ale poszczególne właściwości odczytują / zapisują.

Oczywiście, jeśli implementujesz własne metody dostępu zamiast używać @synthesize, myślę, że te deklaracje nie robią nic poza wyrażeniem twojego zamiaru co do tego, czy właściwość jest implementowana w sposób bezpieczny dla wątków.

Jesse Rusak
źródło
7
Podoba mi się ta odpowiedź - mniej zagmatwana, prostsza i pełniejsza niż te znalezione gdzie indziej!
PapillonUK
Naprawdę świetny i mniej zagmatwany (+1), ale czy możesz powiedzieć, dlaczego nieatomowy potencjalnie dużo szybszy niż atomowy akcesor?
Wish
2
@Wish Non-atomic accessors może być szybsze, ponieważ aby uniemożliwić innym wątkom czytanie / pisanie w tym samym czasie, musisz trzymać muteks lub wykonać inne niskopoziomowe sztuczki, które kosztują czas procesora. Jeśli używasz blokady, możesz również zablokować inne wątki, co również zajmuje trochę czasu.
Jesse Rusak
1
@Rob Możesz zadać nowe pytanie na ten temat.
Jesse Rusak
1
@Pratik Przepraszamy, to nieprawda. Cytat, który pokazujesz, mówi dokładnie to samo, co ja: że tworzenie właściwości atomicpozwala uniknąć awarii podczas uzyskiwania dostępu do poszczególnych właściwości, ale nie gwarantuje, że obiekt jako całość (tj. Dostęp do oddzielnych właściwości, takich jak imię i nazwisko) będzie działać właściwa rzecz.
Jesse Rusak
46

Po przeczytaniu tak wielu artykułów i postów StackOverflow oraz po utworzeniu aplikacji demonstracyjnych do sprawdzania atrybutów właściwości zmiennych, postanowiłem zebrać wszystkie informacje o atrybutach

  1. atomic // default
  2. nieatomowy
  3. strong = retain // default
  4. słaby = unsafe_unretained
  5. zachować
  6. przypisać // domyślne
  7. unsafe_unretained
  8. Kopiuj
  9. tylko czytać
  10. readwrite // default

poniżej znajduje się szczegółowy link do artykułu, w którym można znaleźć wszystkie wymienione wyżej atrybuty, które z pewnością Ci pomogą. Wielkie dzięki dla wszystkich ludzi, którzy udzielają tutaj najlepszych odpowiedzi !!

Zmienne atrybuty właściwości lub modyfikatory w iOS

  1. atomowy
    • Atomowy oznacza, że ​​tylko jeden wątek ma dostęp do zmiennej (typ statyczny).
    • Atomic jest bezpieczny dla wątków.
    • Ale działa wolno.
    • Atomic to zachowanie domyślne.
    • Akcesory atomowe w środowisku, w którym nie jest zbierane śmieci (tj. Podczas korzystania z funkcji retain / release / autorelease) będą używać blokady, aby zapewnić, że inny wątek nie będzie kolidował z poprawnym ustawieniem / pobraniem wartości.
    • w rzeczywistości nie jest to słowo kluczowe.

Przykład:

@property (retain) NSString *name;

@synthesize name;
  1. nieatomowy
    • Nieatomowy oznacza wielowątkowy dostęp do zmiennej (typ dynamiczny).
    • Nieatomowy jest niebezpieczny dla wątków.
    • Ale jest szybki w działaniu.
    • Nieatomowe NIE JEST domyślnym zachowaniem; musimy dodać nieatomowe słowo kluczowe w atrybucie właściwości.
    • może to spowodować nieoczekiwane zachowanie, gdy dwa różne procesy (wątki) uzyskują dostęp do tej samej zmiennej w tym samym czasie.

Przykład:

@property (nonatomic, retain) NSString *name;

@synthesize name;
swiftBoy
źródło
12

Oprócz tego, co już powiedziano o bezpieczeństwie wątków, właściwości nieatomowe są szybsze niż atomowe akcesory. Zwykle nie musisz się tym martwić, ale miej to na uwadze. Właściwości generowane przez dane podstawowe są częściowo nieatomowe z tego powodu.

Marc Charbonneau
źródło
9

W programie wielowątkowym operacja atomowa nie może zostać częściowo przerwana, podczas gdy operacje nieatomowe tak.

Dlatego powinieneś używać muteksów (lub czegoś podobnego), jeśli masz krytyczną operację, która jest nieatomowa, której nie chcesz przerywać.

joshdick
źródło
8

Jeśli określisz „atomic”, wygenerowane funkcje dostępu mają dodatkowy kod chroniący przed jednoczesnymi aktualizacjami.

Paul Tomblin
źródło
6

Zwykle niepodzielny oznacza, że ​​zapis / odczyt do właściwości odbywa się jako pojedyncza operacja. Atomic_operation

Jake
źródło
2

Możesz uzyskać dostęp do tych rzeczy, czytając poniższy artykuł.

Gwintowanie Wyjaśniono z celem nieatomowych

nieatomowy - nie bezpieczny wątkowo

atomic - Thread Safe - jest to domyślny atrybut właściwości.

Easwaramoorthy K
źródło
1
Czy na pewno nie jest odwrotnie? Właściwości atomowe bezpieczne, ale właściwości nieatomowe nie są bezpieczne. Ostatni raz sprawdzałem było tak: P
David Rönnqvist
0

W „atomowe” oznacza, że dostęp do posesji jest bezpieczny wątku. Natomiast «nonatomic» jest przeciwieństwem tego. Kiedy deklarujesz nieruchomość w Objective-C nieruchomości są atomowy domyślnie tak że syntetyzowane Akcesory zapewniają solidną dostęp do własności w środowisku wielowątkowym - to znaczy, że wartość zwracana z metody pobierającej lub ustawiana przez metodę ustawiającą jest zawsze w pełni pobierana lub ustawiana, niezależnie od tego, jakie inne wątki są wykonywane jednocześnie. Jeśli jednak zadeklarujesz właściwość jako nieatomową, jak poniżej

@property (nonatomic, retain)  NSString *myString;

oznacza to, że zsyntetyzowany akcesor dla właściwości obiektu po prostu zwraca wartość bezpośrednio. Efekt atrybutu nieatomowego zależy od środowiska. Domyślnie zsyntetyzowane akcesory są atomowe. Tak więc nieatomowy jest znacznie szybszy niż atomowy.

AbcTest
źródło
-2

Jeden jest przeznaczony dla wielu wątków. Jeden nie


źródło
IMHO: Aby uzyskać jakiekolwiek głosy za, musisz być bardziej precyzyjny i poświęcić trochę czasu na napisanie odpowiedzi.
Johan Karlsson