Wyjaśnienie dotyczące blokowych dokumentów Apple?

Pracuję nad pewnymi problemami związanymi z cyklem zachowawczym z blokami / ARC i staram się opanować niuanse. Wszelkie wskazówki są mile widziane.

Dokumentacja Apple na temat „Bloki i zmienne” (http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html) zawiera następujące informacje:

Jeśli używasz bloku w ramach implementacji metody, reguły zarządzania pamięcią zmiennych instancji obiektu są bardziej subtelne:

Jeśli uzyskasz dostęp do zmiennej instancji przez odniesienie, samo zachowuje się; Jeśli uzyskasz dostęp do zmiennej instancji według wartości, zmienna zostanie zachowana. Poniższe przykłady ilustrują dwie różne sytuacje:

dispatch_async(queue, ^{
    // instanceVariable is used by reference, self is retained
    doSomethingWithObject(instanceVariable);
});


id localVariable = instanceVariable;
dispatch_async(queue, ^{
    // localVariable is used by value, localVariable is retained (not self)
    doSomethingWithObject(localVariable);
});

Uważam to wyjaśnienie za mylące.

Czy jest to właściwe użycie terminologii „według wartości” / „przez odniesienie”? Zakładając, że te zmienne są tego samego typu (id), wydaje się, że cechą odróżniającą między nimi jest ich zakres.

Nie widzę odniesienia do siebie w przykładzie „przez odniesienie”? Jeśli używana była metoda dostępu (np. Poniżej), mogłem zobaczyć zachowanie siebie.

doSomethingWithObject (self.instanceVariable);

Czy masz jakieś wskazówki, kiedy można robić rzeczy w taki czy inny sposób?

Jeśli konwencjonalna mądrość polega na wykorzystaniu zmiennych „według wartości”, wydaje się, że spowoduje to powstanie wielu dodatkowych kodów dla dodatkowych deklaracji zmiennych?W okolicznościach, w których zagnieżdżone bloki wchodzą do gry, wydaje się, że może być łatwiej zachować unikanie deklarowania bloków w sobie nawzajem, ponieważ ostatecznie można by uzyskać potpourri niezamierzonych zachowanych obiektów?

questionAnswers(2)

yourAnswerToTheQuestion