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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
źródło
źródło
Odpowiedzi:
Ta odpowiedź zawiera wiele błędów i jest również nieaktualna. 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, 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
copy
jest 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ć
Assign
jest nieco przeciwne docopy
. Podczas wywoływania obiektu pobierającegoassign
właściwość zwraca odwołanie do rzeczywistych danych. Zwykle używasz tego atrybutu, gdy masz właściwość pierwotnego typu (float, int, BOOL ...)Zachować
retain
jest 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
strong
jest 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ć
strong
iweak
iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Słaby
weak
jest podobny dostrong
tego, ż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.
źródło
nonatomic
oznacza to, że powinien nie być dostępne równocześnie przez wiele wątków. Domyślnie jestatomic
to bezpieczne dla wątków.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.strong
jest 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 kluczowegostrong
oznacza, że jesteś właścicielem obiektu.weak
wł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ładobj.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.copy
Właściwość jest tutaj bardzo dobrze wyjaśnionastrong,weak,retain,copy,assign
wzajemnie 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 ...
źródło
nonatomic
oznacza 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 żeatomic
w porównaniu znonatomic
nie przechwytuje.Ten link ma awarię
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
źródło
Ś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.atomic
Zagwarantuje atomowość użytkownika do odczytu / ustawiania wskaźnika i tylko wskaźnika do atrybutu. Na przykład:W takim przypadku gwarantuje się, że wskaźnik do
dict
zostanie odczytany / ustawiony w sposób atomowy przez różne wątki. ALEdict
samo (słownikdict
wskazują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”.
źródło