ARC скажет мне, когда я должен использовать __block? - PullRequest
5 голосов
/ 16 сентября 2011

AFAIK, __block используется, когда вы изменяете внутри блока адрес, на который указывает переменная (объявленная вне блока).

Но что, если я изменяю значение, на которое указывает переменная, но указатель остается прежним? Например, что если у меня есть NSMutableArray *array и я просто делаю [array addObject:object] внутри блока? В этом случае я не изменяю указатель array, но я изменяю значение, на которое он указывает. Итак, я должен все еще использовать __block при объявлении NSMutableArray *array?

1 Ответ

19 голосов
/ 16 сентября 2011

Вам нужно только __block, если вы изменяете значение переменной.

т.е. если у вас есть:

NSArray* foo;

Вам нужно только __block, если вы измените значение foo. Имейте в виду, что foo - это не что иное, как «указатель на вещь, набранную NSArray». То есть foo - это 64-битное или 32-битное целое число, в зависимости от платформы. Если вы измените это целое число, вам нужно __block. Если нет, вам не нужно __block.

Итак, нет, вам не нужно __block для вызова addObject: в массиве, поскольку вы фактически не меняете значение foo.

Если бы вы делали что-то вроде foo = (expression);, тогда вам понадобилось бы __block.

(обратите внимание, что это одна из причин, по которой параллельное программирование в ОО так чертовски сложно ... исключительно трудно определить «область дисперсии» для любого заданного пути выполнения)

...