Jaka jest różnica między atomowych i nonatomic atrybutów?

głosy
1k

Czego atomici nonatomicmyśli w oświadczeniach majątkowych?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Jaka jest różnica między tymi trzema operacyjny?

Utwórz 26/02/2009 o 03:31
źródło użytkownik
W innych językach...                            


27 odpowiedzi

głosy
1k

Dwa ostatnie są identyczne; „atomowy” jest domyślne zachowanie ( zauważ, że w rzeczywistości nie jest kluczowe, jest określony tylko przez nieobecnośćnonatomic - atomicdodano jako słowo kluczowe w ostatnich wersjach LLVM / brzękiem).

Zakładając, że jesteś @synthesizing implementacje metod Atomic vs. zmian non-atomowych wygenerowany kod. Jeśli piszesz własne Ustawiacz / pobierające, atomowy / nonatomic / zachować / przypisać / kopia są jedynie doradczy. (Uwaga: @synthesize jest domyślne zachowanie w ostatnich wersjach LLVM Nie ma również potrzeby deklarowania zmiennych instancji; będą one syntetyzowane automatycznie, także i będzie mieć. _Poprzedzany do ich nazwy, aby zapobiec przypadkowemu bezpośredni dostęp).

Z „atomową”, zsyntetyzowany setter / getter zapewni, że cała wartość jest zawsze zwrócony z getter lub ustawiona przez seter, niezależnie od aktywności setter na jakimkolwiek innym wątku. To znaczy, jeśli wątek A jest w środku getter, gdy wątek B wywołuje setter, rzeczywista wartość realną - AN autoreleased obiekt, najprawdopodobniej - zostanie zwrócony do rozmówcy w A.

W nonatomicżadne takie gwarancje są wykonane. Tak więc, nonatomicjest znacznie szybszy niż „atomowy”.

Co „atomowy” czy nie zrobić, to żadnych gwarancji o bezpieczeństwo wątków. Jeśli wątek A jest wywołanie getter równocześnie z gwintem B i C wywołanie setter z różnymi wartościami, gwint A można uzyskać dowolny z trzech wartości zwrócone - jeden przed wszelkimi ustawiaczy miano lub jedną z wartości przekazanych do ustawiaczy w B i C. Podobnie, cel może skończyć się wartość z B i C, nie da się stwierdzić.

Zapewnienia integralności danych, - jeden z głównych wyzwań programów wielowątkowych - osiąga się innymi środkami.

Dodając do tego:

atomicity pojedynczej nieruchomości również nie może zagwarantować bezpieczeństwa wątku, gdy wiele właściwości zależne są w grze.

Rozważać:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

W tym przypadku, nici A można przeprowadzać zmiany nazwy przedmiotu przez wywołanie setFirstName:, a następnie wywołanie setLastName:. W międzyczasie, gwint B może nazywać fullNamesię między dwoma połączeniami nawlec i otrzyma nowe imię sprzężony ze starym nazwiskiem.

Aby rozwiązać ten problem, trzeba transakcyjnego modelu . Czyli innego rodzaju synchronizacji i / lub wykluczenia, które pozwala wykluczyć dostęp do fullNamepodczas gdy właściwości zależne są aktualizowane.

Odpowiedział 26/02/2009 o 07:40
źródło użytkownik

głosy
341

Jest to wyjaśnione w Apple dokumentacji , ale poniżej kilka przykładów tego, co się rzeczywiście dzieje. Zauważ, że nie ma „atomowy” słowo kluczowe, jeśli nie podasz „nonatomic” wówczas właściwość jest atomowa, ale określenie „atomowy” wyraźnie spowoduje wystąpienie błędu.

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

Teraz, wariant atomowa jest nieco bardziej skomplikowany:

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

Zasadniczo wersja atomowa musi podjąć blokadę w celu zagwarantowania bezpieczeństwa wątku, a także jest wpadając zliczania ref na obiekcie (i licznik autorelease, aby ją zrównoważyć) tak, że obiekt jest gwarantowana istnieć dla rozmówcy, w przeciwnym razie istnieje jest potencjalnym wyścigu, jeśli inny wątek jest ustawienie wartości, co powoduje, że liczba ref spadnie do 0.

Istnieje rzeczywiście duża liczba różnych wariantów, jak te rzeczy działają w zależności od tego, czy właściwości są wartości skalarne lub przedmioty i jak zachowują, kopiowanie, tylko do odczytu, nonatomic itp interakcji. Ogólnie syntezatory własności tylko wiedzieć jak to zrobić „dobry uczynek” dla wszystkich kombinacjach.

Odpowiedział 26/02/2009 o 07:24
źródło użytkownik

głosy
147

Atomowy

  • Jest to domyślne zachowanie
  • zapewni obecny proces jest zakończony przez CPU, zanim inny proces uzyskuje dostęp do zmiennej
  • Nie jest szybki, ponieważ gwarantuje, że proces jest całkowicie zakończone

Non-Atomic

  • NIE jest to zachowanie domyślne
  • szybszy (syntetyzowany kodu, to znaczy zmiennych utworzonych za pomocą @property i @synthesize)
  • Nie wątku bezpieczny
  • może spowodować nieoczekiwane zachowanie, kiedy dostęp do dwóch różnych procesów w tej samej zmiennej jednocześnie
Odpowiedział 25/05/2012 o 11:56
źródło użytkownik

głosy
124

Najlepszym sposobem, aby zrozumieć różnicę jest za pomocą następującego przykładu.

Załóżmy, że istnieje ciąg atomowy właściwość o nazwie „nazwa”, a jeśli zadzwonisz [self setName:@"A"]z gwintem A, zadzwonić [self setName:@"B"]z nici B i rozmowy[self name] z gwintem C, wtedy wszystkie operacje na różnych wątkach będą wykonywane seryjnie co oznacza, jeśli jeden wątek jest wykonywany setter lub getter, następnie inne wątki będą czekać.

To sprawia, że właściwość „nazwa” odczyt / zapis bezpieczne, ale jeśli inny wątek, D, wzywa [name release]równocześnie wówczas operacja ta może produkować awarii, ponieważ nie ma połączenia setter / getter zaangażowany tutaj. Co oznacza, że obiekt jest odczyt / zapis sejf (atomowych), ale nie bezpieczny wątku jako kolejny wątków może jednocześnie wysłać dowolny typ wiadomości do obiektu. Wywoływacz powinien zapewnić wątku bezpieczeństwa dla takich przedmiotów.

Jeśli właściwość „nazwa” był nonatomic, wtedy wszystkie wątki w powyższym przykładzie - A, B, C i D będą wykonywać jednocześnie wytwarzania dowolnej nieprzewidywalne rezultaty. W przypadku atomu, albo jeden z A, B lub C, wykona pierwszą, a D może nadal wykonywać równolegle.

Odpowiedział 31/01/2012 o 19:36
źródło użytkownik

głosy
108

Składnia i semantyka są już dobrze zdefiniowane przez innych doskonałych odpowiedzi na to pytanie. Ponieważ wykonanie i wydajność nie są dobrze wyszczególnione dodam moją odpowiedź.

Jaka jest różnica między tymi funkcjonalne 3?

Chciałbym zawsze uważane atomowej jako domyślny całkiem ciekawy. Na poziomie abstrakcji pracujemy na, wykorzystując właściwości atomowych dla klasy jako pojazd, aby osiągnąć 100% wątku bezpieczeństwa jest przypadek rogu. Dla prawdziwie poprawnych programów wielowątkowych, interwencja przez programistę jest prawie na pewno to wymóg. Tymczasem, właściwości eksploatacyjne i wykonanie nie zostały jeszcze opisane w głębi. Po napisaniu kilku ciężko wielowątkowych programów na przestrzeni lat, byłem deklarując swoje właściwości jak nonatomiccały czas, bo nie było sensowne atomowy w dowolnym celu. Podczas dyskusji o szczegółach atomowych i nonatomic właściwości to pytanie , zrobiłem kilka profilowanie napotkał pewne ciekawych wyników.

Wykonanie

Ok. Pierwszą rzeczą, którą chciałbym wyjaśnić, że realizacja zamek jest realizacja określone i oderwane. Louis wykorzystuje @synchronized(self)w swoim przykładem - Widziałem to jako wspólnego źródła nieporozumień. Realizacja nie faktycznie używać @synchronized(self); wykorzystuje poziomu obiektu zamki wirowania . Ilustracja Louis jest dobre dla ilustracji na wysokim poziomie za pomocą konstruktów jesteśmy wszyscy znają, ale ważne jest, aby wiedzieć, że nie korzysta @synchronized(self).

Inną różnicą jest to, że właściwości atomowe zachowują / cykl wydawniczy swoich obiektów w getter.

Wydajność

Oto interesujący: Wydajność za pomocą właściwości atomowej dostęp w bezsporne (np jednowątkowym) przypadki mogą być naprawdę bardzo szybko, w niektórych przypadkach. W mniej niż idealny przypadkach korzystanie z dostępów atomowych może kosztować więcej niż 20 razy napowietrznej nonatomic. Chociaż Sporna przypadku użycia 7 Odpowiedź była 44 razy niższa w przypadku struktury trzech bajtów (2,2 GHz Rdzeń i7 Quad Core x86_64). Trzy-bajtowy struct jest przykładem bardzo powolnym nieruchomości.

Ciekawe marginesie: Akcesory zdefiniowane przez struktury z trzech bajtów była 52 razy większa niż syntetyzowanych dostępowych atomowych; lub 84% szybkości zsyntetyzowanych nonatomic dostępowych.

Obiekty w spornych przypadkach może również przekraczać 50 razy.

Ze względu na liczbę optymalizacje i różnice w implementacji, jest to dość trudne do zmierzenia wpływu rzeczywistych w tych kontekstach. Można często usłyszeć coś w stylu „Zaufaj jej, chyba że profil i uważają, że jest to problem”. Ze względu na poziom abstrakcji, to rzeczywiście dość trudne do zmierzenia rzeczywistego wpływu. Gleaning rzeczywiste koszty z profili może być bardzo czasochłonne, a ze względu na abstrakcji, dość niedokładne. Jak dobrze, ARC vs MRC może mieć duże znaczenie.

Warto więc cofnąć, nie skupiając się na realizacji własności dostępów, będziemy obejmować Podejrzani jak objc_msgSendi zbadać kilka rzeczywistych wyników na wysokim poziomie dla wielu połączeń do NSStringgetter w bezspornych spraw (wartości w sekundach):

  • MRC | nonatomic | realizowane ręcznie pozyskiwaniu: 2
  • MRC | nonatomic | syntetyzowane gettera 7
  • MRC | atomowej | syntetyzowane gettera: 47
  • ARC | nonatomic | syntetyzowane Getter: 38 (uwaga: dodawanie ref Ilość cycling tutaj ARC)
  • ARC | atomowej | syntetyzowane gettera: 47

Jak już się zapewne domyślacie, Ilość referencyjna aktywność / jazda na rowerze jest istotnym czynnikiem przyczyniającym się z atomistyki i pod ARC. Można by również zobaczyć większe różnice w spornych sprawach.

Chociaż zwrócić szczególną uwagę na wydajność, ciągle mówię semantyka pierwszy! , Tymczasem wydajność jest niski priorytet dla wielu projektów. Jednak znając szczegółów wykonania i koszty technologii używanych na pewno nie zaszkodzi. Należy użyć odpowiedniej technologii do swoich potrzeb, celów i możliwości. Mam nadzieję, że to pozwoli Ci zaoszczędzić kilka godzin porównań, a pomogą Ci lepiej świadomej decyzji przy projektowaniu programów.

Odpowiedział 18/08/2012 o 10:47
źródło użytkownik

głosy
88

Atomic = bezpieczeństwo wątek

Non-atomowy = brak bezpieczeństwa wątek

bezpieczeństwo wątku:

Zmienne instancji są thread-safe, jeśli zachowują się poprawnie, gdy dostępne z wielu wątków, niezależnie od harmonogramu lub przeplatania wykonania tych wątków przez środowiska wykonawczego i bez dodatkowej synchronizacji lub innej koordynacji ze strony kodu wywołującego.

W naszym kontekście:

Jeśli wątek zmienia wartość instancji zmienił wartość jest dostępna dla wszystkich wątków, a tylko jeden wątek może zmienić wartość w danym momencie.

Gdzie stosować atomic:

Jeśli zmienna instancji jest zamiar być dostępne w środowisku wielowątkowym.

Implikacja atomic:

Nie tak szybko, jak to nonatomicponieważ nonatomicnie wymaga żadnych prac watchdog on, że od wykonywania.

Gdzie stosować nonatomic:

Jeśli zmienna instancji nie zamierzam być zmieniane przez wielu wątków można go używać. Poprawia wydajność.

Odpowiedział 10/07/2013 o 14:07
źródło użytkownik

głosy
67

Znalazłem całkiem dobrze umieścić wyjaśnienie właściwości atomowych i non-atomowych tutaj . Oto niektóre istotne tekst z tym samym:

„atomowy” oznacza, że nie można podzielić. W kategoriach / programowanie OS atomowej wywołanie funkcji to taka, która nie może zostać przerwana - cała funkcja musi zostać wykonana, a nie zamieniłem z CPU za zwyczajowego kontekstu OS za przełączanie aż będzie kompletna. Tylko w przypadku, gdy nie wiadomo: od CPU może zrobić tylko jedną rzecz na raz, OS obraca dostęp do CPU do wszystkich uruchomionych procesów w małych czasowych plasterki, aby dać iluzję z wielozadaniowej. Planista CPU może (i robi) przerwać proces w dowolnym momencie jej wykonania - nawet w połowie wywołania funkcji. Więc dla działań, takich jak uaktualnianie współdzielone zmienne licznika gdzie dwóch procesów usiłujących zaktualizować zmienną w tym samym czasie, muszą być wykonywane „atomowo”, czyli każda akcja aktualizacja ma zakończyć się w całości, zanim jakikolwiek inny proces może być zamienione na PROCESOR.

Więc będę zgadywać, że atomowy w tym przypadku oznacza, metody czytnik atrybut nie może być przerwane - w efekcie oznacza, że ​​zmienna (s) są odczytywane za pomocą sposobu nie można zmienić ich wartości półmetku bo jakiś inny wątek / call / funkcja dostaje zamienione na CPU.

Ponieważ atomiczmienne nie może zostać przerwana, wartości zawarte w nich w każdym momencie jest (gwint blokowaniu) gwarancją nieuszkodzone , chociaż zapewnia tę blokadę gwintu utrudnia dostęp do nich wolniej. non-atomiczmienne, z drugiej strony, nie daje żadnych gwarancji, ale taką oferują luksus szybszego dostępu. Podsumowując, należy przejść do non-atomickiedy wiesz twoi zmienne nie będą dostępne dla wielu wątków jednocześnie i przyspieszyć.

Odpowiedział 24/02/2012 o 06:17
źródło użytkownik

głosy
61

Po przeczytaniu wielu artykułów, stos posty przelewowe i tworzenia aplikacji demonstracyjnych, aby sprawdzić zmienne atrybuty własności, postanowiłem umieścić wszystkie informacje atrybuty razem:

  1. atomic // Domyślna
  2. nonatomic
  3. strong = retain // Domyślna
  4. weak = unsafe_unretained
  5. retain
  6. assign // Domyślna
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // Domyślna

W artykule zmiennych atrybutów własności lub modyfikatory w iOS można znaleźć wszystkie powyższe cechy, a to na pewno pomoże.

  1. atomic

    • atomic oznacza tylko jeden obszar dostępu gwintu zmiennej (typu statycznego).
    • atomic jest bezpieczeństwo wątków.
    • Ale to jest powolny w działaniu
    • atomic Jest to domyślne zachowanie
    • Akcesory atomowe w non śmieci zebranych środowiska (czyli przy użyciu zachować / release / autorelease) użyje blokadę w celu zapewnienia, że ​​inny wątek nie zakłócać prawidłowe ustawienie / uzyskiwanie wartości.
    • To nie jest tak naprawdę kluczowe.

    Przykład:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

    • nonatomic Oznacza Multiple Access gwintu zmienną (typu dynamicznego).
    • nonatomic wątku jest niebezpieczne.
    • Ale jest szybki w działaniu
    • nonatomicNIE jest zachowanie domyślne. Musimy dodać nonatomicsłowa kluczowego w atrybucie nieruchomości.
    • Może to spowodować nieoczekiwane zachowanie, przy dwóch różnych procesów (nici) dostęp do tej samej zmiennej w tym samym czasie.

    Przykład:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    
Odpowiedział 21/03/2013 o 08:10
źródło użytkownik

głosy
52

Najprostsza odpowiedź pierwsze: Nie ma żadnej różnicy między swoimi drugimi dwoma przykładami. Domyślnie Akcesory nieruchomości są atomowy.

Akcesory atomowe w non śmieci zebranych środowiska (czyli przy użyciu zachować / release / autorelease) użyje blokadę w celu zapewnienia, że ​​inny wątek nie zakłócać prawidłowe ustawienie / uzyskiwanie wartości.

Patrz „ Wydajność i Threading sekcję” z Objective-C dokumentacji Apple 2.0 dla niektórych więcej informacji i innych rozważań podczas tworzenia wielowątkowych aplikacji.

Odpowiedział 26/02/2009 o 03:56
źródło użytkownik

głosy
51

Atomic:

gwarancje atomowe, że dostęp do nieruchomości będą wykonywane w sposób atomowej. Np zawsze powrócić w pełni zainicjowane obiektów, dowolny get / zestaw właściwości na jednym wątku musi wypełnić przed kolejnym niego dostęp.

Jeśli wyobrazić sobie następującą funkcję występujące na dwóch wątków na raz można zobaczyć, dlaczego wyniki nie byłyby dość.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Plusy: Powrót pełni zerowana obiektów za każdym razem sprawia, że najlepszym wyborem w przypadku wielowątkowości.

Wady: Wydajność trafiony, sprawia, że wykonanie trochę wolniej

Non-Atomowej:

W przeciwieństwie Atomowej, nie zapewnia w pełni sprowadzona obiekt wrócić za każdym razem.

Plusy: Bardzo szybka realizacja.

Wady: Szanse wartości śmieci w przypadku wielowątkowości.

Odpowiedział 26/02/2009 o 03:41
źródło użytkownik

głosy
31

Atomowy oznacza tylko jeden wątek dostęp zmienną (typu statycznego). Atomic jest bezpieczny wątku, ale jest powolne.

Nonatomic oznacza wiele wątków dostęp do zmiennej (dynamiczny typ). Nonatomic jest thread-niebezpieczne, ale to szybko.

Odpowiedział 22/11/2012 o 12:20
źródło użytkownik

głosy
14

Atomic jest wątek bezpieczne , jest powolny i go dobrze zapewnieniu jak (bez gwarancji) , że tylko zamknięty wartość jest wykonywane bez względu na to jak wiele wątków próbują dostęp w tym samym obszarze. Podczas korzystania atomowy, kawałek kodu napisany wewnątrz tej funkcji staje się częścią sekcji krytycznej, do których tylko jeden wątek może wykonywać jednocześnie.

Zapewnia tylko bezpieczeństwo wątków; nie gwarantuje, że. Chodzi mi o to zatrudnić kierowcę specjalista dla Ciebie samochód, to jeszcze nie gwarantuje, samochód nie spełnia wypadek. Jednak prawdopodobieństwo pozostaje najmniejszym stopniu.

Atomic - nie można rozbić, więc oczekuje się, że wynik. Z nonatomic - gdy inny dostęp gwint strefa pamięci może się zmieniać, to wynik jest nieoczekiwany.

Kod Dyskusja:

Atomic uczynić getter i setter z nieruchomości bezpieczny wątku. na przykład, jeśli u mieć napisane:

self.myProperty = value;

jest bezpieczeństwo wątków.

[myArray addObject:@"Abc"] 

NIE jest bezpieczeństwo wątków.

Odpowiedział 07/07/2015 o 09:56
źródło użytkownik

głosy
12

Nie ma takiego słowa kluczowego „atomowy”

@property(atomic, retain) UITextField *userName;

Możemy użyć jak wyżej

@property(retain) UITextField *userName;

Zobacz przepełnieniem stosu pytanie Otrzymuję problemy, jeśli mogę użyć @property (atomowej, zachowują) NSString * mystring .

Odpowiedział 08/11/2011 o 06:41
źródło użytkownik

głosy
11

Domyślny jest atomic, to znaczy, że ma kosztować wydajność przy każdym użyciu nieruchomości, ale jest to bezpieczne dla wątków. Co Objective-C nie jest ustawione blokady, więc tylko rzeczywista wątek może uzyskać dostęp do zmiennej, tak długo, jak setter / getter jest wykonywany.

Przykład z MRC z właściwości z _internal ivar:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Więc te dwa ostatnie są takie same:

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

Z drugiej strony ma nonatomicnic dodać do kodu. Więc to jest nić tylko bezpieczny, jeśli kod mechanizm bezpieczeństwa siebie.

@property(nonatomic, retain) UITextField *userName;

Słowa kluczowe nie musi być zapisana jako atrybut pierwszy nieruchomości w ogóle.

Nie zapomnij, to nie znaczy, że nieruchomość jako całość jest bezpieczny wątku. Tylko wywołanie metody setter / getter jest. Ale jeśli używasz setter i getter potem w tym samym czasie z 2 różnych wątków, może być uszkodzony też!

Odpowiedział 27/09/2013 o 10:43
źródło użytkownik

głosy
9

atomowa (domyślnie)

Atomic jest domyślnie: jeśli nie wpisuj nic, nieruchomość jest atomowy. Własność atomowa jest zagwarantowane, że jeśli spróbujesz odczytać z niego, dostaniesz z powrotem prawidłową wartość. To nie ma żadnych gwarancji, co może być to, że wartość, ale można wrócić dobrych danych, nie tylko pamięć śmieci. Co to pozwala zrobić, to jeśli masz wiele wątków lub wielu procesów wskazujących na pojedynczej zmiennej, jeden wątek może czytać i inny wątek może pisać. Jeśli trafią w tym samym czasie, wątek czytelnik jest zagwarantowana, aby uzyskać jedną z dwóch wartości: albo przed zmianą lub po zmianie. Co atomowa nie daje to każdy rodzaj gwarancji, która z tych wartości można dostać. Atomic jest bardzo często mylone z byciem wątku bezpieczny, a to nie jest poprawna. Trzeba zagwarantować własnego bezpieczeństwa gwint inne sposoby. Jednak atomowy zagwarantuje, że jeśli starają się odczytać, wrócisz jakąś wartość.

nonatomic

Na stronie klapki, non-atomowy, jak można się domyślić, oznacza po prostu „nie rób tego materiału atomowej.” Co tracisz jest gwarancja, że ​​zawsze wrócić coś. Jeśli próbujesz przeczytać w środku zapisu, można odzyskać dane na śmieci. Ale z drugiej strony, iść trochę szybciej. Ponieważ właściwości atomowe mają zrobić jakąś magię, aby zagwarantować, że dostaniesz z powrotem wartość, są one nieco wolniej. Jeśli jest to właściwość, że łączysz się dużo, możesz spaść do nonatomic aby upewnić się, że nie ponoszą takiej prędkości kary.

Zobacz więcej tutaj: https://realm.io/news/tmi-objective-c-property-attributes/

Odpowiedział 23/07/2016 o 06:34
źródło użytkownik

głosy
8
  • -Atomic oznacza tylko jeden obszar dostępu gwintu zmiennej (typu statycznego).
  • -Atomic jest bezpieczne dla wątków.
  • -ale to jest powolny w działaniu

Jak deklarują:

Jak atomowy jest domyślnym tak,

@property (retain) NSString *name;

I w pliku wdrażania

self.name = @"sourov";

Załóżmy, że zadania związane z trzema właściwościami są

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

Wszystkie właściwości pracować równolegle (jak asynchronicznie).

Jeśli zadzwonisz „name” z gwintem A ,

I

Jednocześnie jeśli zadzwonisz

[self setName:@"Datta"]

z nici B ,

Jeśli teraz * nazwa nieruchomość jest nonatomic następnie

  • zwróci wartość „Datta” dla
  • zwróci wartość „Datta” dla B

To dlatego nie atomowy nazywa wątek niebezpieczne, ale jednak jest szybki w działaniu z powodu wykonania równoległego

Jeśli teraz imię * nieruchomość atomowy

  • Zapewni to wartość „Sourov” dla
  • Wtedy powrót wartość „Dattę” dla B

Dlatego atomowy nazywa wątek bezpieczne i dlatego nazywany jest do odczytu i zapisu bezpieczny

Operacja taka sytuacja będzie wykonywać seryjnie. Powolne i wydajności

- Nonatomic oznacza Multiple Access gwintu zmienny (dynamiczny typu).

- Nonatomic jest gwint niebezpieczne.

- ale jest szybki w działaniu

-Nonatomic NIE jest domyślne zachowanie, musimy dodać nonatomic słowa kluczowego w atrybucie nieruchomości.

Do in Swift Swift Potwierdzenie, że właściwości są nonatomic w sensie objc. Jednym z powodów jest więc zastanowić się, czy niepodzielność per-nieruchomości jest wystarczające dla Twoich potrzeb.

Numer referencyjny: https://forums.developer.apple.com/thread/25642

Fro więcej informacji proszę odwiedzić stronę internetową http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Odpowiedział 13/12/2016 o 03:27
źródło użytkownik

głosy
8

Jeśli używasz swoją nieruchomość w kodzie wielowątkowym następnie będzie można zobaczyć różnicę między atrybutami nonatomic i atomowych. Nonatomic jest szybszy niż atomowa i atomowy jest bezpieczny wątku, nie nonatomic.

Vijayendra Tripathi już podano przykład dla środowiska wielowątkowe.

Odpowiedział 13/08/2014 o 12:57
źródło użytkownik

głosy
7

Zanim zaczniesz: Musisz wiedzieć, że każdy obiekt w pamięci musi być zwalniane z pamięci dla nowego zapisu wydarzy. Nie można po prostu napisać coś na górze, jak to zrobić na papierze. Państwo musi najpierw usunąć (dealloc) go, a następnie można napisać na nim. Jeśli w tej chwili, że skasowaniem jest zrobione (lub pół zrobione) i nic jeszcze nie zostało napisał (lub pół pisał) i spróbować odczytać to może być bardzo problematyczne! Atomic i nonatomic pomóc leczyć ten problem na różne sposoby.

Najpierw należy przeczytać to pytanie, a następnie odczytać odpowiedź Bbum użytkownika . W dodatku potem czytać moje podsumowanie.


atomic będzie zawsze gwarantuje

  • Jeśli dwa różne ludzie chcą czytać i pisać w tym samym czasie, papier nie będzie po prostu spalić! -> Aplikacja nigdy nie upaść, nawet w warunkach wyścigu.
  • Jeśli jedna osoba stara się pisać i napisał tylko 4 z 8 liter pisemnej, to nie może czytać w środku, odczyt może być wykonane tylko wtedy, gdy wszystkie 8 liter jest napisane -> Brak odczytu (GET) nastąpi na „gwint, który jest nadal pisania”, czyli jeśli jest 8 bajtów bajtów do zapisu, a tylko 4 bajty są pisane - aż do tej chwili, nie wolno czytać z niego. Ale ponieważ powiedział, że nie padnie wtedy byłoby odczytać z wartości w autoreleased obiektu.
  • Jeśli przed piśmie ty już usunięte, co zostało wcześniej napisane na papierze, a następnie ktoś chce czytać ty może jeszcze czytać. W jaki sposób? Będziesz czytania z czymś podobnym do Mac OS kosza (jak kosza wciąż nie 100% usuwane jest ... to jest w stanie zawieszenia) ---> Jeśli ThreadA jest czytanie podczas ThreadB już dealloced pisać, byś mógł albo dostać od wartości końcowej pełni pisemnej wartości przez ThreadB lub dostać coś z autorelease basenie.

Zachowują liczy się sposób, w którym pamięć jest zarządzany w Objective-C. Po utworzeniu obiektu, ma ona zachować rachubę 1. Po wysłaniu przedmiotu wiadomość zachować jej zachować licznik jest zwiększany o 1. Po wysłaniu obiektowi wiadomość zwalniającą jej zachować liczba jest zmniejszana o 1. Po wysłać object autorelease wiadomość , jego zachowanie licznika jest zmniejszany o 1 w pewnym momencie w przyszłości. Jeśli an object's zachować liczba zmniejsza się do 0, jest zwalniane.

  • Atomic nie gwarantują bezpieczeństwa wątku, chociaż jego przydatne dla osiągnięcia bezpieczeństwa wątku. Bezpieczeństwo wątków jest w stosunku do tego, jak napisać kod, który wątek / kolejka czytasz / pisemnej. To gwarantuje tylko non-crashable wielowątkowość.

Czekaj, co?! Są wielowątkowość i bezpieczeństwo wątek inaczej?

Tak. Wielowątkowość oznacza: wiele wątków może odczytać wspólny kawałek danych w tym samym czasie i nie będzie katastrofy, ale to nie gwarantuje, że nie czytasz od wartości non-autoreleased. Z bezpieczeństwem wątku, to gwarantuje, że to co czytasz nie jest automatycznie zwolniony. Dlatego, że nie robimy wszystko atomowy domyślnie jest, bo jest koszt wydajność i większość rzeczy naprawdę nie potrzeba bezpieczeństwa wątku. Kilka części naszego kodu potrzebne i dla tych kilku częściach musimy pisać nasz kod w sposób bezpieczny wątku przy użyciu zamki, mutex lub synchronizacji.


nonatomic

  • Ponieważ nie ma czegoś takiego jak Mac OS Trash Bin, a potem nikt nie dba, czy nie zawsze uzyskać wartość (<- To może potencjalnie doprowadzić do awarii), ani ktoś obchodzi, jeśli ktoś próbuje odczytać połowie piszesz (choć w połowie pisania w pamięci jest bardzo różni się od połowy pisania na papierze, pamięć może to dać szalony głupi wartość od wcześniej, podczas gdy na papierze widać tylko połowę, co się pisze) -> nie gwarantuje nie upaść, bo nie wykorzystuje mechanizm autorelease.
  • Nie gwarantuje pełnej wartości pisemne należy czytać!
  • Jest szybsza niż atomowy

Ogólnie są one różne w 2 aspektach:

  • Upaść lub nie z powodu posiadania lub nie posiadania autorelease basen.

  • Pozwalające odczytać w samym środku „piszą jeszcze nie gotowych lub pustą wartość” lub nie dopuszczenia i pozwalający czytać tylko wtedy, gdy wartość jest całkowicie napisane.

Odpowiedział 28/04/2016 o 16:18
źródło użytkownik

głosy
7

Przed omówieniem o atrybutach @property, należy wiedzieć, jaki jest pożytek z @property. @property oferuje możliwość definiowania informacji, że klasa jest przeznaczona do hermetyzacji. Jeśli zadeklarować obiekt / zmienna użyciu @property, to obiekt / zmienna będzie dostępna dla innych klas importujących swojej klasie. Jeśli zadeklarujesz obiektu przy @property w pliku nagłówka, a następnie trzeba go syntetyzować stosując @synthesize w pliku implementacji.

Przykład:

.h klasa

@interface ExampleClass : NSObject
   @property (nonatomic, retain) NSString *name;
@end

.m klasa

@implementation ExampleClass
   @synthesize name;
@end

Teraz kompilator syntezy accessor metody nazwie.

ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];

Lista atrybutów @property: atomowy. nonatomic. zachować. Kopiuj. tylko czytać. readwrite. przydzielać. silny.

atomowa: Jest to zachowanie domyślne. Jeśli obiekt jest zadeklarowana jako atomowy wówczas staje się bezpieczny wątku. Wątku bezpieczny środek, w czasie tylko jeden wątek konkretnej instancji tej klasy może mieć kontrolę nad tym obiektem.

Przykład:

@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic

nonatomic: To nie jest bezpieczny wątku. Można użyć atrybutu właściwość nonatomic aby określić, że syntetyzowane akcesorów prostu ustawić lub zwrócić wartość bezpośrednio, bez żadnych gwarancji, co się dzieje, jeśli ta sama wartość jest dostępna jednocześnie z różnych wątków. Z tego powodu, to szybciej uzyskać dostęp do właściwości nonatomic niż jednego atomu. @property (nonatomic)NSString *name;

zachowują: Nie jest wymagane, gdy atrybut jest wskaźnik do metody setter object.The wzrośnie zachować rachubę obiektu, tak, że będzie zajmować pamięć autorelease basenie. @property (retain)NSString *name;

kopia: Jeśli korzystasz z kopii, nie można używać zachowują. Korzystanie instancji kopia klasy będzie zawierać własną kopię. Nawet jeśli zmienny łańcuch jest ustawiony, a następnie zmienione wystąpienie rejestruje cokolwiek wartość ma w tym czasie jest on ustawiony. będzie syntetyzowany setter i getter żadne metody.

@property (copy) NSString *name;

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"];

tylko do odczytu: Jeśli nie chcesz, aby właściwość zostać zmienione poprzez metody setter, można zadeklarować właściwość tylko do odczytu. @property (readonly) NSString *name;

readwrite: to zachowanie domyślne. Nie trzeba określić atrybut ReadWrite wyraźnie.

@property (readwrite) NSString *name;

przypisać: wygeneruje setter która przypisuje wartość do zmiennej instancji bezpośrednio, zamiast kopiowania lub utrzymania go. To jest najlepsze dla prymitywnych typów jak NSInteger i CGFloat lub obiektów, które bezpośrednio nie są właścicielami, takich jak delegatów.

@property (assign) NSInteger year;

mocne: jest zamiennikiem zachować. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained: Istnieje kilka klas w Cocoa i Cocoa Touch, które nie obsługują jeszcze słabe odwołania, co oznacza, że ​​nie może zadeklarować słabe właściwości lub słaby zmiennej lokalnej śledzić nich. Zajęcia te obejmują NSTextView, NSFont i NSColorSpace itp. Jeśli trzeba użyć słabego odniesienia do jednej z tych klas, trzeba użyć niebezpiecznego odniesienia. Niebezpiecznym referencyjna jest podobny do słabego odniesienia w to, że nie trzymać jej powiązany obiekt żywy, ale to nie będzie ustawiona na zero jeśli obiekt docelowy jest zwalniane.

@property (unsafe_unretained) NSObject *unsafeProperty;

Odpowiedział 18/06/2015 o 05:25
źródło użytkownik

głosy
4

Obiekt atomowy gwarantuje zachowanie wartości w pełni zainicjowane niezależnie od tego, ile wątków robią getter i setter na nim.

Nieruchomość nonatomic określa, że ​​syntetyzowane Akcesory prostu ustawić lub zwrócić wartość bezpośrednio, bez żadnych gwarancji, co się dzieje, jeśli ta sama wartość jest dostępna jednocześnie z różnych wątków.

Odpowiedział 23/10/2015 o 15:41
źródło użytkownik

głosy
3

Atomowy oznacza tylko jeden wątek może uzyskać dostęp do zmiennej w czasie (typu statycznego). Atomic jest bezpieczny wątku, ale jest powolne.

Nonatomic oznacza wiele wątków może uzyskać dostęp do zmiennej w tym samym czasie (dynamiczne typu). Nonatomic jest thread-niebezpieczne, ale to szybko.

Odpowiedział 01/02/2016 o 08:27
źródło użytkownik

głosy
2

Jeśli używasz atomowy, oznacza to, że wątek będzie bezpieczny i tylko do odczytu. Jeśli używasz nonatomic, oznacza to, że wiele wątków dostęp do zmiennej i jest wątek niebezpieczne, ale jest on wykonywany szybko wykonali operacje odczytu i zapisu; Jest to typ dynamiczny.

Odpowiedział 13/02/2016 o 13:34
źródło użytkownik

głosy
0

Atomowość atomowy (domyślnie)

Atomic jest domyślnie: jeśli nie wpisuj nic, nieruchomość jest atomowy. Własność atomowa jest zagwarantowane, że jeśli spróbujesz odczytać z niego, dostaniesz z powrotem prawidłową wartość. To nie ma żadnych gwarancji, co może być to, że wartość, ale można wrócić dobrych danych, nie tylko pamięć śmieci. Co to pozwala zrobić, to jeśli masz wiele wątków lub wielu procesów wskazujących na pojedynczej zmiennej, jeden wątek może czytać i inny wątek może pisać. Jeśli trafią w tym samym czasie, wątek czytelnik jest zagwarantowana, aby uzyskać jedną z dwóch wartości: albo przed zmianą lub po zmianie. Co atomowa nie daje to każdy rodzaj gwarancji, która z tych wartości można dostać. Atomic jest bardzo często mylone z byciem wątku bezpieczny, a to nie jest poprawna. Trzeba zagwarantować własnego bezpieczeństwa gwint inne sposoby. Jednak atomowy zagwarantuje, że jeśli starają się odczytać, wrócisz jakąś wartość.

nonatomic

Na stronie klapki, non-atomowy, jak można się domyślić, oznacza po prostu „nie rób tego materiału atomowej.” Co tracisz jest gwarancja, że ​​zawsze wrócić coś. Jeśli próbujesz przeczytać w środku zapisu, można odzyskać dane na śmieci. Ale z drugiej strony, iść trochę szybciej. Ponieważ właściwości atomowe mają zrobić jakąś magię, aby zagwarantować, że dostaniesz z powrotem wartość, są one nieco wolniej. Jeśli jest to właściwość, że łączysz się dużo, możesz spaść do nonatomic aby upewnić się, że nie ponoszą takiej prędkości kary. Dostęp

dzięki uprzejmości https://academy.realm.io/posts/tmi-objective-c-property-attributes/

atrybuty własności niepodzielność (atomowe i nonatomic) nie są uwzględniane w odpowiedniej deklaracji właściwości Swift, ale gwarancje atomowości z realizacji Objective-C nadal trzymać, gdy importowane nieruchomość jest dostępna od Swift.

Więc - jeśli określają właściwość atomowej w Objective-C pozostanie atomowy kiedy używany przez Swift.

dzięki uprzejmości https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

Odpowiedział 29/01/2019 o 06:12
źródło użytkownik

głosy
0

Właściwości atomowe : - Jeżeli zmienna przypisana własności atomowej to znaczy, że ma tylko jeden wątek, a dostęp będzie wątku bezpieczne i będą dobre perspektywy wydajności, będą miały domyślne zachowanie.

Non atomowe Właściwości : - Jeżeli zmienna przypisana własności atomowej to znaczy, że ma wielu dostępu wątek i nie będzie wątku bezpieczne i będzie powoli punktu widzenia wydajności, będzie miał domyślne zachowanie i kiedy dwa różne wątki chcesz uzyskać dostęp do zmiennej w tym samym czasie to daje nieoczekiwane rezultaty.

Odpowiedział 04/08/2018 o 11:26
źródło użytkownik

głosy
0

Prawda jest taka, że ​​używają oni blokadę wirowania wdrożyć własność atomową. Kod jak poniżej:

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }
Odpowiedział 09/12/2016 o 04:58
źródło użytkownik

głosy
0

Aby uprościć całą zamieszanie pozwala zrozumieć blokadę mutex lock.Mutex wg nazwy blokuje zmienność na object.So jeśli obiekt jest dostępny przez klasę żadna inna klasa może przejść tę samą object.In iOS @sychronise także mutex lock.Now służyć w trybie FIFO i zapewnia przepływ nie jest naruszona przez dwóch klas dzielących tę samą instance.However jeśli zadanie jest na głównym unikaj wątek korzystającego obiektu za pomocą właściwości atomowych, ponieważ może trzymać UI i pogorszyć osiągi

Odpowiedział 23/09/2016 o 18:41
źródło użytkownik

głosy
0

Atomic: Zapewnić wątku bezpieczeństwa poprzez zablokowanie wątku przy użyciu NSLOCK.

Non atomowy: nie zapewnia wątku bezpieczeństwa, ponieważ nie ma gwint mechanizm blokujący.

Odpowiedział 29/06/2016 o 08:56
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more