Wyjaśnienie silnego i słabego przechowywania w iOS5

Jestem nowy w rozwoju iOS5 i używam objective-C. mam problemy ze zrozumieniem różnicy między silnym i słabym przechowywaniem. Przeczytałem dokumentację i inne pytania, ale wszystkie brzmią identycznie jak ja, bez dalszego wglądu.

Przeczytałemdokumentację: Transitioning To ARC - odwołuje się ona do warunków przechowywania, przypisywania i wydawania iOS4; co mnie myli. Następnie zaglądam do Open u CS193p, gdzie odróżnia mocne i słaby:

Strong : "trzymaj to w kupie, dopóki już na to nie wskażę"
Weak : "trzymaj to tak długo, jak ktoś mocno na to wskazuje"

Czy dwie definicje nie są identyczne = jeśli wskaźnik nie wskazuje już na obiekt, to zwolnij pamięć trzymającą obiekt? Rozumiem pojęcie wskaźnika, sterty, alokacji lub dealokacji pamięci - ale jaka jest różnica między silnym a słabym?

Author: nhgrif, 2012-02-13

6 answers

Różnica polega na tym, że obiekt zostanie dealokowany, gdy tylko nie będzie żadnych silnych wskaźników do niego. Nawet jeśli słabe wskaźniki wskazują na niego, gdy ostatni silny wskaźnik zniknie, obiekt zostanie dealokowany, a wszystkie pozostałe słabe wskaźniki zostaną wyzerowane.

Być może przykład jest w porządku.

Wyobraź sobie, że naszym obiektem jest pies, i że pies chce uciec (być dealokowany).

Mocne wskazówki są jak smycz na psa. Dopóki masz smycz przywiązany do psa, pies nie ucieknie. Jeśli pięć osób przymocuje smycz do jednego psa (pięć mocnych wskazówek do jednego przedmiotu), pies nie ucieknie, dopóki wszystkie pięć smyczy nie zostanie odłączonych.

Słabe punkty, z drugiej strony, są jak małe dzieci wskazujące na psa i mówiąc " Spójrz! Pies!"Dopóki pies jest nadal na smyczy, małe dzieci nadal mogą go zobaczyć i nadal będą na niego wskazywać. Jak tylko wszystkie smycze są odłączone, jednak pies ucieka nie ważne, ile małych dzieci na to wskazuje.

Gdy tylko ostatni silny wskaźnik (smycz) przestanie wskazywać na obiekt, obiekt zostanie dealokowany, a wszystkie słabe wskaźniki zostaną wyzerowane.

 501
Author: BJ Homer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 04:31:28

Czy te dwie definicje nie są identyczne.

Absolutnie nie. Kluczową różnicą w dwóch definicjach, które wskazałeś, jest "tak długo, jak ktoś inny". To" ktoś inny " jest ważny.

Rozważ następujące:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

Teraz mamy dwa wskaźniki do <some_object>, jeden silny i jeden słaby. Jeśli ustawimy strongObject na nil Tak:

strongObject = nil;

Następnie, jeśli przejdziesz przez zasady, które nakreśliłeś, zadasz sobie następujące pytania: pytania:

  1. Strong: "trzymaj to w kupie, dopóki nie wskażę na to więcej"

    strongObject to już nie wskazuje na <some_object>. Więc nie musimy go zatrzymywać.

  2. Słaby: "trzymaj to tak długo, jak ktoś mocno na to wskazuje" [25]}

    weakObject nadal wskazuje na <some_object>. Ale ponieważ nikt inny na to nie wskazuje, ta zasada oznacza również, że nie musimy jej zachować.

Wynik jest taki, że <some_object> jest dealokowany i jeśli twój runtime go obsługuje (Lion i iOS 5 w górę), a następnie weakObject zostanie automatycznie ustawione na nil.

Zastanów się teraz, co się stanie, jeśli ustawimy weakObject na nil w następujący sposób:

weakObject = nil;

Następnie, jeśli przejdziesz przez zasady, które nakreśliłeś, zadasz sobie te pytania:

  1. Strong: "trzymaj to w kupie, dopóki nie wskażę na to więcej"

    strongObject wskazuje na <some_object>. Więc musimy go zatrzymać.

  2. Słaby: "trzymaj to tak długo, jak ktoś inny wskazuje na to mocno "

    weakObject nie wskazuje na <some_object>.

Wynik jest taki, że <some_object> jest nie dealokowany, ale weakObject będzie wskaźnikiem nil.

[zauważ, że wszystko, co zakłada {[3] } nie jest wskazywane przez inne silne odniesienie gdzieś indziej / jakieś inne środki bycia "trzymanym"]

 34
Author: mattjgalloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 15:14:54

Strong

  1. tworzy własność pomiędzy właściwością a przypisaną wartością.
  2. jest to domyślne dla właściwości obiektu w ARC, więc nie pozwala martwić się o liczbę referencji i zwolnić referencję automatycznie.
  3. jest zamiennikiem dla retain. Używamy wtedy i tylko wtedy, gdy musimy użyć jako zachować.

Słaby

  1. tworzy Nie-własność pomiędzy właściwością a przypisaną wartością.
  2. Strong jest używany na obiekcie nadrzędnym, a weak na obiekcie podrzędnym gdy rodzic jest zwolniony, to odniesienie do obiektu potomnego jest również ustawione na nil
  3. zapobiega zatrzymywaniu cykli.
  4. nie chroni obiektu odniesienia podczas zbierania przez garbage collector.
  5. słaba jest zasadniczo przypisana, nieodwracalna właściwość.
 2
Author: Shashi3456643,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 14:15:35

Inny przykład: Student jest Object, przypuszcza, że może ukończyć (deallocate) tak długo, jak skończy wszystkie podstawowe kursy (strong pointers), bez względu na to, czy weźmie udział w fakultatywnych kursach (weak pointers). Innymi słowy: silny wskaźnik jest jedynym czynnikiem dealokacji tego Object.

 2
Author: rObOtAndChalie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 17:49:44

Nie, nie są identyczne, ale bardzo różne. Używasz strong tylko wtedy, gdy musisz zachować obiekt. Używasz słabego w każdym innym przypadku, z de przewagą, że możesz wiedzieć, czy obiekt ha został usunięty ze sterty, ponieważ nikt go nie zatrzymuje.

 1
Author: Gabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 15:05:47

Wiem, że jestem dość spóźniony na tę imprezę, ale myślę, że ważne jest, aby zdezorientować problem, zwracając uwagę, że znaczenie "mocnych i słabych modeli pamięci" zależy od tego, czy mówisz o oprogramowaniu czy sprzęcie.

Dla sprzętu, słaby lub silny wskazuje, czy istnieje wsparcie dla spójności sekwencyjnej.

[SC oznacza to]...wynik dowolnego wykonania jest taki sam, jak gdyby operacje wszystkich procesory były wykonywane w pewnej kolejności, a operacje poszczególnych procesorów pojawiają się w tej kolejności w kolejność określona przez jego program. - Lamport, 1979

WTF czy to ma coś wspólnego z pamięcią? Oznacza to, że zapisy do zmiennych przez różne procesory muszą być postrzegane w tej samej kolejności przez wszystkie procesory. W sprzęcie z mocnym modelem jest to gwarantowane. Na sprzęcie ze słabym modelem nie jest.

Istniejące odpowiedzi interpretują pytanie tylko w kategoriach modeli pamięci programowej. Sprzęt jest nie ma znaczenia dla programowania. To samo pytanie dotyczy iOS, który zazwyczaj działa na procesorach Arm7. Arm7 ma słaby model pamięci. Dla programistów przyzwyczajonych do procesorów z mocnym modelem - czyli nas wszystkich, bo x86 i x64 mają mocny model - to straszna pułapka. Używanie boola do sygnalizowania innego wątku do wyjścia działa dobrze w mocnym modelu. Ten sam kod na Arm w ogóle nie działa, chyba że zaznaczasz flagę lotną, a nawet wtedy jest nieobliczalny.

Choć prawdą jest, że Arm8 + zmienia to całkowicie z wyraźnym wsparciem dla nabycia/wydania, starsze oprogramowanie nie korzysta z tego wsparcia. Starsze oprogramowanie zawiera wszystkie trzy systemy operacyjne telefonu i wszystko, co na nich działa, a także kompilatory i biblioteki, dopóki nie zostaną zaktualizowane.

Dla rozszerzonego zbadania tego tematu odsyłam do niepowtarzalnego Herb Sutter .

 1
Author: Peter Wone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-17 23:52:42