@ właściwość zachowaj, Przypisz, skopiuj, nieatomowe w Objective-C

Jako ktoś nowy w Objective-C czy ktoś może dać mi przegląd zachowania, przypisania, kopiowania i innych, których mi brakuje, które są zgodne z dyrektywą @ property? Co oni robią i dlaczego miałbym chcieć używać jednego nad drugim?

Author: iPhone Programmatically, 2010-02-13

4 answers

Artykuł linkowany przez MrMage nie działa. Oto, czego nauczyłem się w moim (bardzo) krótkim czasie kodowania w Objective-C:

Nonatomic vs. atomic - "atomic" jest domyślne. Zawsze używaj "nieatomowego". Nie wiem dlaczego, ale książka, którą przeczytałem, mówi, że "rzadko jest powód", aby użyć "atomowego". (BTW: książka, którą czytałem, to książka BNR "Programowanie iOS".)

Readwrite vs. readonly - domyślnym ustawieniem jest" readwrite". Kiedy @ syntetyzujesz, zarówno getter, jak i setter zostaną stworzone dla ty. Jeśli użyjesz "readonly", żaden setter nie zostanie utworzony. Użyj go do wartości, której nigdy nie chcesz zmieniać po utworzeniu instancji obiektu.

Zachowaj vs. Kopiuj vs. przypisuj

  • "assign" jest domyślne. W seterze utworzonym przez @synthesize wartość zostanie po prostu przypisana do atrybutu. Rozumiem, że "assign" powinien być używany dla atrybutów bez wskaźnika.
  • "zachowaj" jest potrzebne, gdy atrybut jest wskaźnikiem do obiektu. Setter generowany przez @synthesize zachowa (aka doda liczbę zatrzymanych) obiekt. Musisz zwolnić Obiekt, gdy skończysz z nim.
  • "kopia" jest potrzebna, gdy obiekt jest zmienny. Użyj tego, jeśli potrzebujesz wartości obiektu w obecnym stanie i nie chcesz, aby odzwierciedlała ona zmiany dokonane przez innych właścicieli obiektu. Będziesz musiał zwolnić Obiekt, gdy skończysz z nim, ponieważ zachowujesz kopię.
 263
Author: Blamdarot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-23 20:02:02

Zanim dowiesz się o atrybutach @ property, powinieneś wiedzieć ,jakie jest użycie @ property.

  • @właściwość oferuje sposób definiowania informacji, które klasa ma enkapsulować. Jeśli zadeklarujesz obiekt / zmienną używając @ property , wtedy obiekt / zmienna będzie dostępna dla innych klas importujących jej klasę.

  • Jeśli zadeklarujesz obiekt za pomocą @ property w pliku nagłówkowym, to musisz zsyntetyzuj go używając @ synthesize w pliku implementacji. To sprawia, że obiekt jest zgodny z KVC . Domyślnie kompilator zsyntetyzuje metody accessora dla tego obiektu.

  • Metody dostępu to: setter i getter.

Przykład: .h

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

.m

@implementation XYZClass
@synthesize name;
@end

Teraz kompilator zsyntetyzuje metody accessora dla nazwy.

XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
  • Lista atrybutów @property

    Atomic, nonatomic, retain, copy, readonly, readwrite, assign, strong, getter=method, setter=method, unsafe_unreted

  • Atomic jest domyślnym zachowaniem. Jeśli obiekt jest zadeklarowany jako atomowy, staje się bezpieczny dla wątku. Thread-safe oznacza, że tylko jeden wątek danej instancji tej klasy może mieć kontrolę nad tym obiektem.

Jeśli wątek wykonuje metodę getter, to inny wątek nie może wykonać metody setter na tym obiekcie. Jest powolny.

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • nieatomowy{[22] } nie jest bezpieczny dla wątków. Możesz użyć atrybutu właściwości nieatomowej, aby określić, że zsyntetyzowane Accesory po prostu ustawiają lub zwracają wartość bezpośrednio, bez gwarancji, co się stanie, jeśli ta sama wartość będzie dostępna jednocześnie z różnych wątków.

Z tego powodu dostęp do właściwości nieatomowych jest szybszy niż atomowych.

@property (nonatomic)NSString *name;   
  • zachowaj jest wymagane, gdy atrybut jest wskaźnikiem do obiektu.

Metoda setter zwiększy liczbę zatrzymań obiektu, tak że zajmie On pamięć w Puli autorelease.

@property (retain)NSString *name;
  • copy Jeśli używasz opcji copy, nie możesz użyć opcji Zachowaj. Użycie instancji copy klasy będzie zawierać jej własną kopię.

Nawet jeśli zmienny łańcuch znaków jest ustawiony, a następnie zmieniony, instancja przechwytuje dowolną wartość ma w czasie, gdy jest ustawiony. Nie zostaną zsyntetyzowane żadne metody setter i getter.

@property (copy) NSString *name;

Teraz,

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

Nazwa pozostanie nienaruszona.

  • readonly jeśli nie chcesz zezwolić na zmianę właściwości za pomocą metody setter, możesz zadeklarować właściwość readonly.

Kompilator wygeneruje getter, ale nie setter.

@property (readonly) NSString *name;
  • readwrite jest domyślnym zachowaniem. Nie musisz określać ReadWrite atrybut jawnie.
Jest przeciwieństwem readonly.
@property (readwrite) NSString *name;
  • assign wygeneruje setter, który przypisze wartość bezpośrednio do zmiennej instancji, zamiast ją kopiować lub zatrzymywać. Jest to najlepsze dla prymitywnych typów, takich jak NSInteger i CGFloat, lub obiektów, których bezpośrednio nie posiadasz, takich jak delegaty.

Pamiętaj zachować i przypisać są zasadniczo wymienne, gdy wywóz śmieci jest włączone.

@property (assign) NSInteger year;
  • strong jest zamiennikiem retain.

Pochodzi z łuku.

@property (nonatomic, strong) AVPlayer *player; 
  • getter = metoda Jeśli chcesz użyć innej nazwy dla metody getter, możesz określić własną nazwę przez dodanie atrybutów do właściwości.

W przypadku właściwości logicznych (właściwości, które mają wartość tak lub nie), zwyczajowo metoda getter zaczyna się od słowa "is"

@property (getter=isFinished) BOOL finished;
  • setter = metoda Jeśli chcesz użyć innej nazwy dla metody setter, możesz określić własną nazwę przez dodanie atrybutów do właściwości.

Metoda powinna kończyć się dwukropkiem.

@property(setter = boolBool:) BOOL finished;
  • unsafe_unreted istnieje kilka klas w Cocoa i Cocoa Touch, które jeszcze nie obsługują słabych odniesień, co oznacza, że nie możesz zadeklarować słabej Właściwości lub słabej zmiennej lokalnej, aby je śledzić. Te klasy obejmują NSTextView, NSFont i NSColorSpace, itd. Jeśli chcesz użyć słabego odniesienia do jednej z tych klas, musisz użyć niebezpiecznego odniesienia.

Niebezpieczne odniesienie jest podobne do słabego odniesienia, ponieważ nie utrzymuje przy życiu powiązanego obiektu, ale nie zostanie ustawione na nil , jeśli obiekt docelowy zostanie dealokowany.

@property (unsafe_unretained) NSObject *unsafeProperty;

Jeśli chcesz określić wiele atrybutów, po prostu dołącz je jako listę rozdzielaną przecinkami, jak poniżej:

@property (readonly, getter=isFinished) BOOL finished;
 274
Author: liza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 15:14:31

po przeczytaniu wielu artykułów postanowiłem złożyć wszystkie informacje o atrybutach razem:

  1. atomic / / default
  2. nieatomowe
  3. strong=retain //default
  4. weak= unsafe_unreted
  5. assign / / default
  6. unsafe_unreted
  7. Kopia
  8. readonly
  9. readwrite / / default

Poniżej link do szczegółowy artykuł, w którym można znaleźć te atrybuty.

Wielkie podziękowania dla wszystkich ludzi, którzy dają najlepsze odpowiedzi tutaj!!

Atrybuty właściwości zmiennych lub modyfikatory w systemie iOS

Oto Przykładowy opis z Artykułu

  1. atomic - Atomic oznacza, że tylko jeden wątek ma dostęp do zmiennej (Typ statyczny). - Atomic jest bezpieczny. - ale to jest powolne w wydajności - atomic jest domyślnym zachowaniem - Atomic accessors in a non środowisko garbage collected (np. podczas używania retain/release/autorelease) użyje blokady do upewnij się, że inny wątek nie koliduje z prawidłowym ustawieniem / pobieraniem wartości. - to nie jest słowo kluczowe.

Przykład:

@property (retain) NSString *name;

@synthesize name;
  1. nieatomowe - Nonatomic oznacza dostęp wielu wątków do zmiennej (Typ dynamiczny). - Nieatomowe są niebezpieczne. - ale jest szybki w wydajności - Nonatomic nie jest domyślnym zachowaniem, musimy dodać słowo kluczowe nonatomic w atrybut 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;

Wyjaśnij:

Załóżmy, że istnieje atomic string właściwość o nazwie "name" , a jeśli wywołasz [self setName:@ "a"] z wątku a, wywołaj [self setName:@ "B"] z wątku B, A wywołaj [self name] Z wątku C, wtedy cała operacja na innym wątku będzie wykonywana seryjnie, co oznacza, że jeśli jeden wątek jest wykonywany setter lub getter, wtedy inne wątki będą czekać. To sprawia, że właściwość "name" odczyt/zapis jest Bezpieczna, ale jeśli inny wątek D wywoła jednocześnie [name release], operacja ta może spowodować awarię, ponieważ nie ma tu wywołania setter/getter. Co oznacza, że obiekt jest bezpieczny do odczytu/zapisu (atomowy), ale nie jest bezpieczny dla wątku, ponieważ inne wątki mogą jednocześnie wysyłać do obiektu dowolne wiadomości. Programista powinien zapewnić bezpieczeństwo wątku dla takich obiektów.

Jeśli właściwość "Nazwa" była nieatomowe, wtedy wszystkie wątki w powyższym przykładzie-A,B, C i D będą wykonywane jednocześnie dając dowolny nieprzewidywalny wynik. W przypadku atomów, jeden z A, B lub C będzie wykonywany jako pierwszy, ale D może nadal wykonywać równolegle.

  1. strong (iOS4 = zachowaj ) - tu jest napisane: "trzymaj to w kupie, dopóki nie wskażę na to więcej." - innymi słowy " jestem właścicielem, nie można dealloc to przed aim dobrze z tym samym, co zachować" - Używasz strong tylko wtedy, gdy musisz zachować obiekt. - Domyślnie wszystkie zmienne instancji i zmienne lokalne są silnymi wskaźnikami. - Zazwyczaj używamy strong dla UIViewControllers (UI item ' s parents) - strong jest używany z ARC i zasadniczo pomaga, nie martwiąc się o liczbę zatrzymanych przedmiotów. ARC automatycznie zwalnia go dla ciebie, gdy skończysz z nim.Użycie słowa kluczowego strong oznacza, że jesteś właścicielem obiektu.

Przykład:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. weak (iOS4 = unsafe_unreted ) - pisze "trzymaj to tak długo, jak ktoś mocno na to wskazuje" - to samo, co przypisanie, bez zatrzymywania lub zwalniania - "Słabe" odniesienie to odniesienie, którego nie zachowujesz. - Generalnie używamy słabych dla Iboutletów (UIViewController ' s Childs).To działa, ponieważ obiekt potomny tylko musi istnieć tak długo jak obiekt nadrzędny. - słabe odniesienie to odniesienie, które nie chroni odnośnego obiektu przed zbieraniem przez garbage collector. - Słaba to w zasadzie przypisanie, nieruchomość niezabezpieczona. Z wyjątkiem gdy obiekt jest dealokowany, słaby wskaźnik jest automatycznie ustawiany na nil

Przykład:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Mocne i słabe Wyjaśnienie, dzięki BJ Homer:

Wyobraź sobie, że naszym obiektem jest pies, i że pies chce uciec (być dealokowany). Mocne wskazówki są jak smycz na psa. Tak długo, jak masz smycz przymocowana do psa, pies nie ucieknie. Jeśli pięć osób przywiązuje smycz do jednego psa, (pięć mocnych wskazówek do jednego przedmiotu), wtedy pies nie ucieknie, dopóki wszystkie pięć smyczy nie zostanie odłączonych. Słabe punkty, z drugiej strony, są jak małe dzieci wskazujące na psa i mówiąc: "Spójrz! Pies!"Dopóki pies jest nadal na smyczy, małe dzieci nadal mogą go zobaczyć i nadal będą na niego wskazywać. Jak tylko wszystkie smycze zostaną odłączone, pies ucieka bez względu na to, ile małych dzieci na niego wskazuje. Gdy tylko ostatni silny wskaźnik (smycz) przestanie wskazywać na obiekt, obiekt zostanie dealokowane, a wszystkie słabe wskaźniki zostaną wyzerowane. Kiedy używamy słabych? Tylko wtedy, gdy chcesz użyć słabego, to jeśli chcesz uniknąć zatrzymywania cykli (np. rodzic zatrzymuje dziecko, a dziecko zatrzymuje rodzica, więc żadne z nich nie jest nigdy zwolnione).

  1. = silny -zostanie zachowana, zostanie zwolniona Stara wartość i zostanie przypisana - retain określa, że nowa wartość powinna zostać wysłana -retain przy przypisaniu i Stara wartość wysłana-release - zachowanie jest takie samo jak silny. - apple mówi, że jeśli napiszesz zachowaj to automatycznie przekonwertuje / działa jak silny tylko. -metody takie jak "alloc" zawierają implicit "retain"

Przykład:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. przypisać - assign jest domyślne i po prostu wykonuje przypisanie zmiennej - assign jest atrybutem właściwości, który mówi kompilatorowi, jak zsyntetyzować implementację settera właściwości - Użyłbym assign dla C primitive properties i weak dla słabych odniesień do Objective-C obiektów.

Przykład:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. Unsafe_unreted

    - unsafe_unreted jest kwalifikatorem własności, który mówi ARC, jak wstawić wywołania retain/release - unsafe_unreted jest wersją Arc assign.

Przykład:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. Kopia - kopiowanie jest wymagane, gdy obiekt jest zmienny. - copy określa, że nowa wartość ma zostać wysłana-copy on assignment i Stara wartość sent-release. - kopia jest jak retain zwraca obiekt, który musisz jawnie zwolnić (np. w dealloc) w środowiskach bez śmieci. - jeśli używasz copy to nadal musisz to zwolnić w dealloc. - Użyj tego, jeśli chcesz, aby wartość obiektu była taka, jaka jest w tej chwili, i nie chcesz, aby wartość ta odzwierciedlała jakiekolwiek zmiany dokonane przez inne właścicieli obiektu. Będziesz musiał zwolnić Obiekt, gdy skończysz z nim, ponieważ zachowujesz kopię.

Przykład:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;
 138
Author: swiftBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:32

Atomic property może być dostępne tylko przez jeden wątek na raz. Jest to thread safe . Wartość domyślna to atomic .Należy pamiętać, że nie ma słowa kluczowego atomic

Nonatomic oznacza, że wiele wątków może uzyskać dostęp do elementu .jest to wątek

Więc należy być bardzo ostrożnym podczas korzystania z atomic .jak to wpływa na wydajność kodu

 8
Author: Kannan Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 03:29:20