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.
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.
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 do copy
. Podczas wywoływania obiektu pobierającego assign
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
i weak
iOS 5.
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Słaby
weak
jest podobny do strong
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.
nonatomic
oznacza to, że powinien nie być dostępne równocześnie przez wiele wątków. Domyślnie jest atomic
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 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, 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.
copy
Właściwość jest tutaj bardzo dobrze wyjaśniona
strong,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 ...
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 że atomic
w porównaniu z nonatomic
nie przechwytuje.
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ść.
Ś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:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
W takim przypadku gwarantuje się, że wskaźnik do dict
zostanie odczytany / ustawiony w sposób atomowy przez różne wątki. ALE dict
samo (słownik dict
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”.