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


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

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.


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;

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.


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ć.


8

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




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.


-2

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


IMHO: Aby uzyskać jakiekolwiek głosy za, musisz być bardziej precyzyjny i poświęcić trochę czasu na napisanie odpowiedzi.
Johan Karlsson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.