Celem bloków było uczynienie go tak automatycznym i przejrzystym jak to tylko możliwe, aby używać bloków o minimalnej składni i mieć je "po prostu działać".
Zmienne blokowe inne niż ___, jako domyślne, są bardziej zgodne z pojęciem "zamknięć", które reprezentują bloki. Blok miga stan wszystkich zmiennych, do których odwołuje się blok w momencie, gdy wykonanie przechodzi nad deklaracją bloku. Obejmuje to zarówno kopiowanie pamięci/stanu, jak i zachowywanie wszelkich odwołań do obiektów Object-C przechwyconych w bloku.
__block
skutecznie przerywa enkapsulację stanu w obrębie bloku. Bardzo przydatne, ale wymaga ręcznego zarządzania referencjami obiektu ze strony programisty.
tj. zmienne blokowe nie -__ "po prostu działają" częściej zmienne __block, a więc domyślnym zachowaniem było grawitowanie do "po prostu działa".
W praktyce koszt przechwytywania stanu w bloku jest zwykle minimalny. Wymierny wpływ na wydajność aplikacji jest zazwyczaj rzadki i często wskazuje na architektoniczny problem o bardziej głębokim charakterze.
Jeśli przez:
__block SelfClass * blockSelf = self;
Czy odnoszą się do przekroju wyrobu bloków i ARC? Tak, to trochę niefortunne. Ale kompilator ostrzega również przed bardzo realnym problemem, o którym musisz wiedzieć. Jednak czystsze obejście byłoby oczywiście lepsze.
Niezupełnie; w obu przypadkach blok jest blokiem o rozmiarze stosu i tym samym zostanie zniszczony wraz z zakresem. Musisz skopiować blok, aby przetrwał zakres. Jak dobrze, jest to tylko jeden mały detal '__block'; tam wojna wiele innych czynników jazdy. – bbum