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.
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.
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.
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ę...
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ść.
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".
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