2011-10-31 10 views

Odpowiedz

4

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.

0

Ponieważ __block może przetrwać zniszczenie stosu. Będzie to jedyny zauważalny z C++ scoped zmienne:

{ 
    __block shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will not be deleted until the block is destructed 
{ 
    shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will be deleted here 

Jest również zauważalne ze zbierania śmieci, ale jej znacznie mniej widoczne i trudne do uczynienia przykładzie.

+0

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

Powiązane problemy