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?