Co oznacza „nieatomowy” w tym kodzie?
@property(nonatomic, retain) UITextField *theUsersName;
Jaka jest różnica między atomową a nieatomową?
Dzięki
Co oznacza „nieatomowy” w tym kodzie?
@property(nonatomic, retain) UITextField *theUsersName;
Jaka jest różnica między atomową a nieatomową?
Dzięki
Odpowiedzi:
Spójrz na Apple Docs .
Zasadniczo, jeśli powiesz nonatomic
i 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 ), @synthesize
metody 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.
atomic
pozwala 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.
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
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 !!
Przykład:
@property (retain) NSString *name;
@synthesize name;
Przykład:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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.
Jeśli określisz „atomic”, wygenerowane funkcje dostępu mają dodatkowy kod chroniący przed jednoczesnymi aktualizacjami.
Zwykle niepodzielny oznacza, że zapis / odczyt do właściwości odbywa się jako pojedyncza operacja. Atomic_operation
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.
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.
Jeden jest przeznaczony dla wielu wątków. Jeden nie