Atrybut C zadeklarowany @ atrybuty właściwości (nieatomowe, kopiowanie, mocne, słabe)

289

Czy ktoś może mi wyjaśnić szczegółowo, kiedy muszę korzystać każdy atrybut: nonatomic, copy, strong, weak, i tak dalej, dla zadeklarowanej właściwości i wyjaśnić, co każdy robi? Byłby też świetny przykład. Używam ARC.

Gaurav_soni
źródło
Oto odpowiedź stackoverflow.com/a/32942413/1961064
Grigori Jlavyan
rypress.com/tutorials/objective-c/properties to wszystko wyjaśnia
Deepak Thakur

Odpowiedzi:

559

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


Nieatomowe

nonatomicjest używany do celów wielowątkowych. Jeśli ustawiliśmy atrybut nieatomowy w momencie deklaracji, wówczas 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.

Kopiuj

copyjest wymagany, gdy obiekt można modyfikować. Użyj tego, jeśli potrzebujesz wartości obiektu w tej chwili i nie chcesz, aby ta wartość odzwierciedlała wszelkie zmiany wprowadzone przez innych właścicieli obiektu. Będziesz musiał zwolnić obiekt, gdy skończysz go, ponieważ zachowujesz kopię.

Przydzielać

Assignjest nieco przeciwne do copy. Podczas wywoływania obiektu pobierającego assignwłaściwość zwraca odwołanie do rzeczywistych danych. Zwykle używasz tego atrybutu, gdy masz właściwość pierwotnego typu (float, int, BOOL ...)

Zachować

retainjest wymagany, gdy atrybut jest wskaźnikiem do obiektu. Seter wygenerowany przez@synthesize zachowa (czyli doda licznik zachowań) obiekt. Po zakończeniu musisz zwolnić obiekt. Zastosowanie retain zwiększy liczbę retain i zajmie pamięć w puli autorelease.

Silny

strongjest zamiennikiem atrybutu zachowaj, jako część zautomatyzowanego zliczania odniesień Objective-C (ARC). W kodzie innym niż ARC jest to tylko synonim zachowania.

Jest to strona dobrze poznać strongi weakiOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Słaby

weakjest podobny do strongtego, że nie zwiększy liczby odwołań o 1. Nie staje się właścicielem tego obiektu, a jedynie przechowuje odniesienie do niego. Jeśli liczba odwołań do obiektu spadnie do 0, mimo że nadal możesz tu wskazywać, zostanie on zwolniony z pamięci.

Powyższy link zawiera zarówno dobre informacje dotyczące słabych, jak i mocnych stron.

iDhaval
źródło
1
jeśli używasz tego NSString tylko wewnętrznie w tej klasie, a nawet nie potrzebujesz właściwości, możesz po prostu uczynić go iVar, a jeśli używasz go w innej klasie niż ja to doradzę (silne, kopiowanie).
Ankit Srivastava
1
Brakuje właściwości Przypisz.
mskw
10
nonatomicoznacza to, że powinien nie być dostępne równocześnie przez wiele wątków. Domyślnie jest atomicto bezpieczne dla wątków.
wcochran
1
Trochę niepokojące jest to, że po całym tym czasie definicja nieatomowej jest nadal błędna i przypomina atomową. Zastanawiam się, ile osób korzystało z tego w ciągu ostatnich pięciu lat i odniosło złe wrażenie. To, co powiedział @wcochran, było poprawne. nonatomic oznacza, że ​​dostęp do wskaźnika nie jest obsługiwany atomowo, a zatem nie jest bezpieczny dla wątków. Zaletą, jaką rozumiem nieatomowej, jest to, że jest lżejsza.
John Bushnell,
1
Oprócz komentarza @JohnBushnell istnieje wiele innych błędów i nieścisłości w tej odpowiedzi. Nie zestarzał się również dobrze, więc jest nieco historyczny. Idź szukać gdzie indziej, jeśli szukasz odpowiedzi na to pytanie.
CRD
45

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, mogą się zdarzyć złe rzeczy, ale jest to znacznie szybsze niż właściwość atomowa.

strongjest używany z ARC i zasadniczo pomaga ci, nie martwiąc się o liczbę zatrzymań obiektu. ARC automatycznie zwalnia go, gdy skończysz. Użycie słowa kluczowego strongoznacza, że ​​jesteś właścicielem obiektu.

weakwłasność oznacza, że ​​nie jesteś jej właścicielem i po prostu śledzi obiekt, dopóki obiekt, do którego został przypisany, pozostanie, gdy tylko drugi obiekt zostanie zwolniony, traci swoją wartość. Na przykład obj.a=objectB;jest używana, a a ma słabą właściwość, niż jej wartość będzie ważna tylko do momentu, gdy obiekt B pozostanie w pamięci.

copyWłaściwość jest tutaj bardzo dobrze wyjaśniona

strong,weak,retain,copy,assignwzajemnie się wykluczają, więc nie można ich używać na jednym obiekcie ... przeczytaj sekcję „Zadeklarowane właściwości”

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

Ankit Srivastava
źródło
dlaczego silny, słaby, zachowaj, skopiuj, przypisz wzajemnie wykluczające się
vinoth.kumar
nonatomicoznacza tylko, że nie stosuje się wyłączenia. Nie oznacza to, że dostęp nie jest bezpieczny dla wątków. To jest szczegółów wdrażania że atomicw porównaniu z nonatomicnie przechwytuje.
bbum
@bbum Czy potrafisz wyjaśnić różnicę między brakiem wykluczenia a brakiem bezpieczeństwa wątku ..?
Ankit Srivastava
1
@AnkitSrivastava wyklucza się, gdy wątek A blokuje wątkowi B zejście ścieżką kodu. Jeśli ta ścieżka kodu jest bezpieczna do wykonania z wielu wątków, wykluczenie nie jest konieczne. Niepewny wątek oznacza, że ​​ścieżka kodu może dawać nieokreślone wyniki, jeśli A i B zejdą jednocześnie. To wykluczenie może być użyte do uczynienia czegoś bezpiecznym dla wątku, ale bezpieczeństwo wątku nie wymaga wykonania na wyłączność - niespójności -.
bbum
17

Ten link ma awarię

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

przypisanie implikuje __unsafe_unretained własności.

Kopiowanie oznacza __solidną własność, a także zwykłe zachowanie semantyki kopiowania na urządzeniu ustawiającym.

zachowaj oznacza silną własność.

silna oznacza silną własność.

unsafe_unretained implikuje __unsafe_unretained własność.

słaby oznacza __słabą własność.

Mick MacCallum
źródło
czy właściwość Assign nie jest używana tylko dla iVar i wartości? Dlaczego więc jest niebezpieczny i dlaczego należy zauważyć, że nie został zachowany?
mskw
9

Świetne odpowiedzi! Jedną rzeczą, którą chciałbym wyjaśnić głębiej, jest nonatomic/ atomic. Użytkownik powinien zrozumieć, że ta właściwość - „atomowość” rozprzestrzenia się tylko w odniesieniu do atrybutu, a nie w jego treści. Tj. atomicZagwarantuje atomowość użytkownika do odczytu / ustawiania wskaźnika i tylko wskaźnika do atrybutu. Na przykład:

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

W takim przypadku gwarantuje się, że wskaźnik do dictzostanie odczytany / ustawiony w sposób atomowy przez różne wątki. ALE dictsamo (słownik dictwskazujący na) jest nadal niebezpieczne dla wątku , tzn. Wszystkie operacje odczytu / dodania do słownika są nadal niebezpieczne dla wątku.

Jeśli potrzebujesz kolekcji bezpiecznej dla wątków, albo masz złą architekturę (częściej) LUB rzeczywiste wymagania (rzadziej). Jeśli jest to „prawdziwe wymaganie” - powinieneś albo znaleźć dobry i przetestowany bezpieczny element do zbierania wątków LUB przygotować się na próby i udręki, pisząc własny. W tym drugim przypadku przyjrzyjmy się paradygmatom „bez blokady”, „bez czekania”. Na pierwszy rzut oka wygląda jak nauka o rakietach, ale może pomóc osiągnąć fantastyczną wydajność w porównaniu do „zwykłego blokowania”.

nickolay
źródło