Jaka jest różnica między słabym a silnym atrybutem ustawiającym właściwości w Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
Jaki jest wpływ i korzyści?
Słyszałem, że słaby nie jest dostępny na iOS 4 i musimy użyć przypisania.
Czy słaby jest podobny do przypisania?
Odpowiedzi:
Możesz włączyć lub wyłączyć ARC dla określonego pliku. Jeśli jest włączona, nie możesz użyć
retain
release
autorelease
etc ... Zamiast tego używaszstrong
weak
dla właściwości lub__strong
__weak
dla zmiennych (domyślnie__strong
). Mocny to odpowiednik zachowania, jednak ARC zarządza wydaniem za Ciebie.Jedyny przypadek, w którym chciałbyś użyć słabego, to gdybyś chciał uniknąć zachowania cykli (np. Rodzic zatrzymuje dziecko, a dziecko rodzica, więc żadne z nich nie jest nigdy zwolnione).
Część „darmowego mostu” (odlewanie od
NS
doCF
) jest trochę skomplikowana. Nadal musisz ręcznie zarządzaćCFRelease()
iCFRetain()
dla obiektów CF. Kiedy konwertujesz je z powrotem na obiekty NS, musisz powiedzieć kompilatorowi o liczbie zachowań, aby wiedział, co zrobiłeś.Wszystko jest tutaj .
źródło
Oto informacje, które wiem o właściwościach zmiennych
więc poniżej znajduje się link do szczegółowego artykułu, w którym można znaleźć wyżej wymienione wszystkie atrybuty, które zdecydowanie Ci pomogą. Wielkie dzięki dla wszystkich ludzi, którzy udzielają tutaj najlepszych odpowiedzi !!
01. strong (iOS4 = retain) - jest napisane „trzymaj to w stosie, dopóki nie wskażę tego więcej” - innymi słowy „Jestem właścicielem, nie możesz cofnąć przydziału, zanim wycelujesz dobrze z tym samym co zatrzymaj "- Używasz silnego tylko wtedy, gdy musisz zachować przedmiot. - Domyślnie wszystkie zmienne instancji i zmienne lokalne są silnymi wskaźnikami. - Generalnie używamy strong dla UIViewControllers (rodziców elementu UI) - strong jest używane z ARC i zasadniczo pomaga, ponieważ nie musisz martwić się o liczbę zatrzymań obiektu. ARC automatycznie zwalnia go za Ciebie, gdy skończysz z tym. Użycie słowa kluczowego strong oznacza, że jesteś właścicielem obiektu.
Przykład:
02. słaby (iOS4 = unsafe_unretained) - jest napisane „trzymaj to tak długo, jak ktoś inny mocno na to wskazuje” - to samo, co przypisuj, nie zachowaj ani nie zwolnij - „Słabe” odniesienie to odniesienie, którego nie zachowujesz. - Zwykle używamy słabego dla IBOutlets (UIViewController's Childs). Działa to, ponieważ obiekt potomny musi istnieć tylko tak długo, jak obiekt nadrzędny. - słabe odwołanie to odwołanie, które nie chroni obiektu, do którego się odwołujemy, przed zebraniem przez moduł odśmiecania pamięci. - Słabe jest w istocie przypisane, niezatrzymane. Z wyjątkiem sytuacji, w której obiekt jest zwalniany, słaby wskaźnik jest automatycznie ustawiany na zero
Przykład:
Wyjaśnij : podziękowania dla BJ Homera
Wyobraź sobie, że naszym przedmiotem jest pies, który chce uciec (zostać zwolniony). Silne wskazówki są jak smycz na psie. Dopóki masz przypiętą smycz do psa, pies nie ucieknie. Jeśli pięć osób przypina smycz do jednego psa (pięć mocnych wskazówek do jednego przedmiotu), pies nie ucieknie, dopóki wszystkie pięć smyczy nie zostanie odczepione. Z drugiej strony słabe wskazówki są jak małe dzieci, które wskazują na psa i mówią „Patrz! Pies!”. Dopóki pies jest na smyczy, małe dzieci mogą go nadal widzieć i nadal będą na niego wskazywać. Jednak gdy tylko wszystkie smycze zostaną odpięte, pies ucieka bez względu na to, ile małych dzieci na niego wskazuje. Gdy tylko ostatni silny wskaźnik (smycz) nie będzie już wskazywał na obiekt, obiekt zostanie zwolniony, a wszystkie słabe wskaźniki zostaną wyzerowane. Kiedy używamy słabych? Jedyny przypadek, w którym chciałbyś użyć słabego, to gdybyś chciał uniknąć zachowania cykli (np. Rodzic zatrzymuje dziecko, a dziecko rodzica, więc żadne z nich nie jest nigdy zwolnione).
źródło
strong=retain
iassign
oznaczone jako domyślne, ale nie może to być oba.weak
istrong
w swoich przykładach. Czy nie byłoby bardziej sensowne, gdyby rodzic miałstrong
odniesienia do swoich dzieci (jakomyButton
własnośćUIViewController
klasy, którą pokazałeśweak
) i że dzieci zachowująweak
odniesienia do swojego rodzica (jakviewController
własność klasy potomnej, którą ty? ve zamiast tego ustaw nastrong
). Na przykład, czytając Matta Neuburga,iOS 7 Programming Fundamentals
pokazuje, że klasa, która deklaruje delegata jako własność, utrzyma ją w stanie „słabym, to wydaje się sprawiedliwe.Aby przywołać fragmenty dokumentów, do których odwołuje się Robert, a które bezpośrednio odpowiadają na twoje dwa ostatnie pytania:
Nazywa się to zerowym słabym odniesieniem. Możesz tworzyć słabe referencje, które nie zerują słabych referencji, używając __unsafe_unretained, ale jak sama nazwa wskazuje, generalnie nie jest to zalecane.
Również w dokumentach:
źródło
__unsafe_unretained
jest to wersja ARCassign
.Krystalicznie jasne wykorzystanie właściwości WEAK jest następujące:
źródło
weźmy przykład, aby rozwinąć więcej (powyższe odpowiedzi są już świetne), niech ten przykład trochę bardziej pomoże
mamy dwie klasy A i B.
powyższy kod wygeneruje cykl utrzymania, ponieważ oba są silnym typem a --------> b ---------> a
aby tego uniknąć, musisz użyć właściwości week jednego z nich, aby co tydzień odnosił się do obiektu i nie zwiększał jego liczby referencji.
źródło