Jestem nowy w rozwoju iOS5 i używam Objective-c. Mam problem ze zrozumieniem różnicy między mocną i słabą pamięcią. Przeczytałem dokumentację i inne pytania SO, ale wszystkie brzmią identycznie jak ja, bez dalszego wglądu.
Przeczytałem dokumentację: Przejście do ARC - odnosi się do warunków przechowywania, przypisywania i zwalniania iOS4; co mnie dezorientuje. Potem zaglądam do Open U CS193p, gdzie rozróżnia mocne i słabe:
Mocne : „trzymaj to w stosie, dopóki nie będę na to wskazywało”
Słabe : „trzymaj to, dopóki ktoś inny mocno na to nie wskaże ”
Czy te dwie definicje nie są identyczne = jeśli wskaźnik nie wskazuje już obiektu, to zwolnij pamięć, w której znajduje się obiekt? Rozumiem pojęcie wskaźników, sterty, alokacji lub zwalniania pamięci - ale jaka jest różnica między silnym a słabym?
Odpowiedzi:
Różnica polega na tym, że obiekt zostanie zwolniony, gdy tylko nie ma na niego silnych wskazówek. Nawet jeśli wskazują na to słabe wskaźniki, po zniknięciu ostatniego silnego wskaźnika obiekt zostanie cofnięty, a wszystkie pozostałe słabe wskaźniki zostaną wyzerowane.
Być może przykład jest w porządku.
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.
źródło
Absolutnie nie. Kluczową różnicą w dwóch wskazanych przez Ciebie definicjach jest „tak długo, jak ktoś inny”. Ważny jest „ktoś inny”.
Rozważ następujące:
Teraz mamy dwie wskazówki
<some_object>
, jedną silną i jedną słabą. Jeśli tak namstrongObject
sięnil
podoba:Następnie, jeśli przejdziesz przez zasady, które nakreśliłeś, zadasz sobie następujące pytania:
Mocne: „trzymaj to na stosie, dopóki nie wskażę tego więcej”
strongObject
już nie wskazuje<some_object>
. Więc nie musimy tego zachować.Słabe: „zachowaj to tak długo, jak długo ktoś inny mocno na to wskaże”
weakObject
nadal wskazuje<some_object>
. Ale ponieważ nikt inny na to nie wskazuje, zasada ta oznacza również, że nie musimy jej przestrzegać.W rezultacie następuje
<some_object>
zwolnienie alokacji i jeśli środowisko wykonawcze ją obsługuje (od wersji Lion i iOS 5),weakObject
zostanie automatycznie ustawione nanil
.Zastanówmy się teraz, co się stanie, jeśli ustawiony
weakObject
nanil
tak:Następnie, jeśli przejdziesz przez zasady, które nakreśliłeś, zadasz sobie następujące pytania:
Mocne: „trzymaj to na stosie, dopóki nie wskażę tego więcej”
strongObject
wskazuje na<some_object>
. Więc musimy to zachować.Słabe: „zachowaj to tak długo, jak długo ktoś inny mocno na to wskaże”
weakObject
nie wskazuje<some_object>
.Rezultatem jest to, że nie
<some_object>
jest zwolniony, ale będzie wskaźnikiem.weakObject
nil
[Zwróć uwagę, że wszystko, co jest zakładane,
<some_object>
nie jest wskazywane przez inne silne odniesienie gdzieś indziej / inne sposoby bycia „przetrzymywanym”]źródło
UIApplication
obiekt? Będzie to silnie odnosić się do wewnętrznego działaniaUIKit
- ale nie musisz się tym martwić.Silny
Słaby
źródło
Inny przykład: student jest studentem
Object
, który przypuszczalnie może ukończyć studia (deallocate
), o ile ukończył wszystkie kursy podstawowe (strong pointers
), bez względu na to, czy bierze udział w kursach fakultatywnych (weak pointers
). Innymi słowy: silny wskaźnik jest jedynym czynnikiem umożliwiającym cofnięcie tego przydziałuObject
.źródło
Nie, nie są identyczne, ale bardzo różne. Używasz silnego tylko wtedy, gdy musisz zachować przedmiot. Używasz słabego w każdym innym przypadku, z zaletą tego, że możesz wiedzieć, czy obiekt został usunięty ze sterty, ponieważ nikt go nie zatrzymuje.
źródło
Wiem, że jestem raczej spóźniony na tę imprezę, ale myślę, że ważne jest, aby zmylić sprawę, wskazując, że znaczenie „mocnych i słabych modeli pamięci” zależy od tego, czy mówisz o oprogramowaniu, czy sprzęcie.
W przypadku sprzętu, słaby lub silny wskazuje, czy istnieje obsługa spójności sekwencyjnej.
WTF czy to ma coś wspólnego z pamięcią? Oznacza to, że zapisy do zmiennych przez różne procesory muszą być widziane w tej samej kolejności przez wszystkie procesory. W sprzęcie z mocnym modelem jest to gwarantowane. Na sprzęcie ze słabym modelem tak nie jest.
Istniejące odpowiedzi interpretują pytanie tylko w kategoriach modeli pamięci oprogramowania. Sprzęt nie jest bez znaczenia dla programowania. To samo pytanie dotyczy iOS, który zwykle działa na procesorach Arm7. Arm7 ma słaby model pamięci. Dla programistów przyzwyczajonych do procesorów z mocnym modelem - którym jest każdy z nas, bo x86 i x64 mają mocny model - to straszna pułapka. Używanie bool do sygnalizowania wyjścia innemu wątkowi działa dobrze w silnym modelu. Ten sam kod na Arm nie działa w ogóle, chyba że oznaczysz flagę jako lotną, a nawet wtedy jest błędny.
Chociaż prawdą jest, że Arm8 + całkowicie to zmienia z wyraźnym wsparciem dla nabycia / wydania, starsze oprogramowanie nie korzysta z tej obsługi. Starsze oprogramowanie obejmuje wszystkie trzy systemy operacyjne telefonu i wszystko, co na nich działa, a także kompilatory i biblioteki, dopóki nie zostaną zaktualizowane.
W celu dokładniejszego zbadania tego tematu odsyłam do niepowtarzalnego Herb Suttera .
źródło