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
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.
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.
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 ...
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.
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. 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”.