Istnieją dwa nowe atrybuty zarządzania pamięcią dla właściwości wprowadzonych przez ARC strong
i weak
.
Poza tym copy
, co jest oczywiście czymś zupełnie innym, czy są jakieś różnice między strong
vs retain
a weak
vs assign
?
Z mojego zrozumienia, jedyną różnicą jest to, że weak
przypisze nil
wskaźnik do wskaźnika, podczas gdy assign
nie, co oznacza, że program zawiesi się, gdy wyślę komunikat do wskaźnika po jego zwolnieniu. Ale jeśli użyję weak
, tak się nigdy nie stanie, ponieważ wiadomość wysłana do nil
nic nie zrobi.
Nie wiem o różnicach między strong
i retain
.
Czy jest jakiś powód, dla którego powinno się używać assign
i retain
w nowych projektach, lub są tego rodzaju są przestarzałe?
ios
objective-c
ios5
properties
automatic-ref-counting
Jakub Arnold
źródło
źródło
strong
,weak
iunsafe_unretained
.weak
astrong
) i 4 zmienne kwalifikatory żywotność (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Zobacz uwagi ARC poniżej.assign
podczas kompilacji z ARC było błędem. Istnieje wiele usuniętych odpowiedzi na ten temat. Wygląda na to, że zostało zmienione przed ostatecznym wydaniem.unsafe_unretained
jest preferowanym atrybutem dla wielu z nas wczesnych użytkowników. Aby dowieść, żeunsafe_unretained
jest to prawidłowy atrybut, zapoznaj się z „Programowaniem z celem C” firmy Apple w sekcji „Hermetyzowanie danych” pod podtytułem „Używaj niebezpiecznych bezpiecznych odwołań dla niektórych klas”. Co mówi: „W przypadku właściwości oznacza to użycie atrybutu unsafe_unretained:”Odpowiedzi:
Od informacji o przejściu do wersji ARC (przykład w sekcji dotyczącej atrybutów właściwości).
Tak
strong
samo jakretain
w deklaracji majątkowej.W przypadku projektów ARC
strong
zamiast tegoretain
użyłbymassign
dla pierwotnych właściwości C iweak
słabych odniesień do obiektów Objective-C.źródło
assign
dla obiektu. Trzeba użyć jednejweak
lubunsafe_unretained
(co jest niebezpieczne, oczywiście), jeśli nie chcesz, aby zachować właściwości.assign
kompiluje mi się dobrze w projektach ARC z celem wdrożenia 4.0.retain
Vs.strong
. Przypuszczam, że to w większości nieszkodliwe, ale wyobrażam sobie, że powinno to byćstrong
dla spójności ... a może to nie ma znaczenia. stackoverflow.com/questions/7796476/…assign
w niektórych przypadkach jest to nadal aktualne.Po przeczytaniu tylu artykułów Posty Stackoverflow i aplikacje demonstracyjne, aby sprawdzić atrybuty właściwości zmiennych, postanowiłem zebrać wszystkie informacje o atrybutach razem:
Poniżej znajduje się szczegółowy link do artykułu, w którym można znaleźć wyżej wymienione wszystkie atrybuty, które na pewno Ci pomogą. Ogromne podziękowania dla wszystkich ludzi, którzy udzielają tutaj najlepszych odpowiedzi !!
1. silny (iOS4 = zachowaj)
Przykład:
2. słaby -
Przykład:
Mocne i słabe wyjaśnienia, dzięki BJ Homer :
Kiedy używamy słabego?
Jedynym czasem, w którym chciałbyś użyć słabego, jest to, że chcesz uniknąć zatrzymywania cykli (np. Rodzic zachowuje dziecko, a dziecko zachowuje rodzica, więc żadne z nich nie zostanie nigdy zwolnione).
3. pozostań = silny
Przykład:
4. przypisać
Przykład:
źródło
default
znaczy? Jeśli korzystam@property (nonatomic) NSString *string
to jeststrong
? Czyassign
? Ponieważ oba są domyślne.nieatomowy / atomowy
silny / słaby / przypisać
(Opcjonalny)
Kopiuj
tylko czytać
źródło
O ile wiem
strong
iretain
są synonimami, więc robią dokładnie to samo.Wtedy
weak
jest prawie jakassign
, ale automatycznie ustawia się na zero po tym, jak obiekt, na który wskazuje, jest zwolniony.Oznacza to, że możesz je po prostu wymienić.
Jednakże , istnieje jeden szczególny przypadek z jaką się spotkałem, gdzie miałem do użytku
assign
, zamiastweak
. Powiedzmy, że mamy dwie właściwościdelegateAssign
idelegateWeak
. W obu jest przechowywany nasz delegat, który jest naszym właścicielem, mając jedyne silne odniesienie. Delegat dokonuje dezalokacji, więc-dealloc
wywoływana jest również nasza metoda.Delegat jest już w trakcie procesu zwolnienia, ale nadal nie jest całkowicie zwolniony. Problem polega na tym, że
weak
odniesienia do niego zostały już unieważnione! WłaściwośćdelegateWeak
zawiera zero, aledelegateAssign
zawiera prawidłowy obiekt (wszystkie właściwości zostały już zwolnione i unieważnione, ale nadal są prawidłowe).Jest to dość szczególny przypadek, ale pokazuje nam, jak działają te
weak
zmienne i kiedy są one zerowane.źródło
Dokument Clanga na temat automatycznego liczenia referencyjnego Objective-C (ARC) wyjaśnia jasno kwalifikatory własności i modyfikatory:
Następnie istnieje sześć modyfikatorów własności deklarowanej własności:
Jeśli chodzi o semantykę, kwalifikatory własności mają różne znaczenie w pięciu zarządzanych operacjach : Czytanie, Przydział, Inicjalizacja, Zniszczenie i Przenoszenie, w których przez większość czasu zależy nam tylko na różnicy w działaniu Przypisanie.
Inna różnica w czytaniu, inicjowaniu, niszczeniu i przenoszeniu znajduje się w rozdziale 4.2 Semantyka w dokumencie .
źródło
Aby zrozumieć silną i słabą referencję, rozważ poniższy przykład, załóżmy, że mamy metodę o nazwie displayLocalVariable.
W powyższej metodzie zakres zmiennej myName jest ograniczony do metody displayLocalVariable, po zakończeniu metody zmienna myName, która zawiera ciąg „ABC”, zostanie zwolniona z pamięci.
Co jeśli chcemy zachować wartość zmiennej myName przez cały cykl życia kontrolera widoku. W tym celu możemy utworzyć właściwość o nazwie nazwa użytkownika, która będzie miała silne odwołanie do zmiennej myName (patrz
self.username = myName;
poniższy kod), jak poniżej,Teraz w powyższym kodzie widać, że mojaNazwa została przypisana do self.username, a self.username ma silne odniesienie (jak zadeklarowaliśmy w interfejsie za pomocą @property) do myName (pośrednio ma silne odniesienie do łańcucha „ABC”). Dlatego ciąg myName nie zostanie zwolniony z pamięci, dopóki self.username nie będzie żył.
Zastanówmy się teraz nad przypisaniem myName do dummyName, które jest słabym odniesieniem, self.dummyName = myName; W przeciwieństwie do silnego odwołania Słaby będzie przechowywać myName tylko do momentu, gdy będzie silne odniesienie do myName. Zobacz poniższy kod, aby zrozumieć Słabe referencje,
W powyższym kodzie jest Słabe odniesienie do myName (tzn. Self.dummyName ma Słabe odniesienie do myName), ale nie ma silnego odwołania do myName, dlatego self.dummyName nie będzie w stanie utrzymać wartości myName.
Teraz ponownie rozważ poniższy kod,
W powyższym kodzie self.username ma silne odwołanie do myName, stąd self.dummyName będzie miało teraz wartość myName nawet po zakończeniu metody, ponieważ myName ma z nim związane silne odwołanie.
Teraz za każdym razem, gdy odwołujemy się do zmiennej, jej liczba zatrzymań jest zwiększana o jeden, a zmienna nie zostanie cofnięta przy zatrzymaniu, osiąga wartość 0.
Mam nadzieję że to pomoże.
źródło
Silny:
Przykład: @property (silny, nieatomowy) ViewController * viewController;
@synthesize viewController;
Słaby
Domyślnie automatycznie dostaje się i ustawia na zero
Przykład: @property (słaby, nieatomowy) IBOutlet UIButton * myButton;
@synthesize myButton;
źródło
Różnice między silnymi i zachowującymi:
Różnice między słabym a przypisaniem:
źródło