5

AFAIK, __block jest używany, gdy zmieniasz wewnątrz bloku adres, na który wskazuje zmienna (zadeklarowana poza blokiem).Czy ARC powie mi, kiedy muszę użyć __block?

Ale co się stanie, jeśli zmienię wartość wskazywaną przez zmienną, ale wskaźnik pozostanie taki sam? Na przykład, jeśli mam NSMutableArray *array i czy robię tylko [array addObject:object] wewnątrz bloku? W tym przypadku nie zmieniam wskaźnika array, ale zmieniam wartość, na którą wskazuje. Czy nadal muszę używać __block w zadeklarowaniu NSMutableArray *array?

Odpowiedz

19

Potrzebujesz tylko __block, jeśli zmieniasz wartość zmiennej.

tj. jeśli masz:

NSArray* foo; 

Wystarczy __block jeśli zmienić wartość foo. Teraz należy pamiętać, że foo to nic innego jak "wskaźnik do rzeczy, która jest wpisana jako NSArray". To znaczy. foo jest efektywnie 64-bitową lub 32-bitową liczbą całkowitą, w zależności od platformy. Jeśli zmienisz tę liczbę całkowitą, potrzebujesz __block. Jeśli nie, nie potrzebujesz __block.

Tak, nie, nie potrzebujesz __block, aby zadzwonić pod numer addObject: w tablicy, ponieważ w rzeczywistości nie zmieniasz wartości foo.

Jeśli miałbyś zrobić coś takiego jak foo = (expression);, to potrzebujesz __block.

(należy pamiętać, że jest to jeden z powodów, dla których programowanie współbieżne pod oo jest tak cholernie ciężko ... jest wyjątkowo trudny do zdefiniowania „domenę wariancji” dla danej ścieżki wykonania)

+0

Co o optymalizacji kompilator ? '__block' może podpowiedzieć, że obiekt nigdy się nie zmienia, a jeśli narysowano" NSArray ", kolejne wywołania pojemności mogły być błędne. – Dani

+2

'__block' wskazuje, że zmienna może się zmienić. Niezależnie od tego, czy zmienna to '__block' czy const-copy (jak jest domyślna), wywołanie metody na obiekcie nie będzie miało wpływu. – bbum

+0

Ale co się stanie, jeśli zmienna (NSArray *) jest właściwością własną? Czy __block należy dodać? – Amnysia