Objective - C zadeklarowane atrybuty @ property (nonatomic, copy, strong ,weak)

Czy ktoś może mi wyjaśnić szczegółowo kiedy muszę używać każdego atrybutu: nonatomic, copy, strong, weak, i tak dalej, dla deklarowanej nieruchomości, i wyjaśnić, co każdy robi? Jakiś przykład też byłby świetny. Używam ARC.

Author: Josh Caswell, 2012-03-25

4 answers

Ta odpowiedź ma wiele błędów i jest również przestarzała. Zobacz inne pytania/odpowiedzi i komentarze.


Nieatomowe

nonatomic jest używany do celów wielowątkowych. Jeśli ustawiliśmy atrybut nieatomowy w momencie deklaracji, to każdy inny wątek chcący uzyskać dostęp do tego obiektu może uzyskać do niego dostęp i dać wyniki w odniesieniu do wielowątkowości.

Kopia

copy jest wymagane, gdy obiekt jest mutable. 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ę.

Assign

Assign jest nieco przeciwieństwem copy. Wywołując getter właściwości assign, zwraca odniesienie do rzeczywistych danych. Zazwyczaj używasz tego atrybutu, gdy masz własność typu prymitywnego (float, int, BOOL...)

Zachowaj

retain jest wymagane, gdy atrybut jest wskaźnikiem do obiektu. Setter wygenerowany przez @synthesize zachowa (aka doda liczbę zatrzymań) obiekt. Musisz zwolnić Obiekt, gdy skończysz z nim. Użycie zachowaj zwiększy liczbę zachowań i zajmie pamięć w Puli autorelease.

Strong

strong jest zamiennikiem atrybutu retain, jako część Objective - C Automated Reference Counting (ARC). W kodzie nie-ARKOWYM jest to tylko synonim zachowania.

To jest dobra strona, aby dowiedzieć się o strong i weak dla iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Słabe

weak jest podobny do strong z tym, że nie zwiększy liczby referencji o 1. Nie staje się on właścicielem tego przedmiotu, lecz jedynie posiada do niego odniesienie. Jeśli liczba referencji obiektu spadnie do 0, mimo że nadal możesz na nią wskazywać, zostanie ona usunięta z pamięci.

Powyższy link zawiera zarówno dobre informacje dotyczące słabego jak i mocnego.

 551
Author: iDhaval,
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
2018-03-01 22:40:34

nonatomic właściwość stwierdza, że obiekt nie jest bezpieczny dla wątku, co oznacza, że jeśli inny wątek spróbuje uzyskać dostęp do tego obiektu, może zdarzyć się coś złego, ale jest to znacznie szybsze niż właściwość atomowa.

strong jest używany z ARC i w zasadzie pomaga, nie martwiąc się o liczbę zatrzymanych obiektó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.

weak własność oznacza, że nie jesteś jej właścicielem i po prostu śledzi obiekt, aż obiekt, do którego został przypisany, pozostanie , gdy tylko drugi obiekt zostanie zwolniony, traci wartość is. Dla np. obj.a=objectB; jest używane i A ma słabą właściwość, niż jego wartość będzie ważna tylko do czasu, aż objectB pozostanie w pamięci.

copy własność jest bardzo dobrze wyjaśnione tutaj

strong,weak,retain,copy,assign wzajemnie się wykluczają, więc nie można ich używać na jednym obiekcie... przeczytaj sekcję "Deklarowane właściwości"

Mam nadzieję, że to ci pomoże trochę...

 45
Author: Ankit Srivastava,
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 10:31:28

This link has the break down

Http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

Assign implikuje_ _ unsafe _ unrethed własność.

Kopia implikuje _ _ silną własność, jak również zwykłe zachowanie kopii semantyka na seterze.

Zachować implikuje _ _ silne własności.

Strong implikuje _ _ strong ownership.

Unsafe_unreted implikuje _ _ unsafe_unreted własność.

Słaba implikacja _ _ słaba własność.

 17
Author: Mick MacCallum,
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
2012-03-25 11:31:15

Świetne odpowiedzi! Jedną z rzeczy, które chciałbym wyjaśnić głębiej jest nonatomic/atomic. Użytkownik powinien zrozumieć, że ta właściwość - "atomicity" rozprzestrzenia się tylko na referencji atrybutu, a nie na jego zawartości. Tzn. atomic zagwarantuje użytkownikowi atomiczność odczytu / ustawienia wskaźnika i tylko wskaźnik do atrybutu. Na przykład:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

W tym przypadku jest gwarantowane, że wskaźnik do dict będzie odczytywany / ustawiany w sposób atomowy przez różne wątki. Ale dict sam (słownik dict wskazuje na) jest nadal wątkiem unsafe , tzn. wszystkie operacje odczytu/dodania do słownika są nadal wątkiem unsafe.

Jeśli potrzebujesz thread safe collection, albo masz złą architekturę (częściej), albo rzeczywiste wymagania (rzadziej). Jeśli jest to "prawdziwe Wymaganie" - powinieneś albo znaleźć dobry & tested thread safe collection component lub być przygotowany na próby i uciski pisząc swój własny. To ostatnie spojrzenie na paradygmaty "lock-free", "wait-free". Na pierwszy rzut oka wygląda jak rakieta, ale może pomóc w osiągnięciu fantastycznej wydajności w porównaniu do "zwykłego blokowania".

 9
Author: DaddyM,
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
2015-03-15 13:12:21