Как используется ключевое слово "__block" в Objective-c? - PullRequest
2 голосов
/ 07 сентября 2011

Только что заметил ключевое слово __block в некотором коде Objective-c, например:

// myString passed into the method
__block NSString *_myString = myString;

Как ключевое слово __block меняет поведение приведенного выше кода?

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

Этот модификатор переменной позволяет изменять переменную в области видимости блока.

0 голосов
/ 05 марта 2013

Позволяет несколько вещей:

  1. Позволяет присвоить переменную внутри блока, который ее захватывает.
  2. Позволяет блоку видеть изменения в значении переменной после создания блока.
  3. В MRC переменная __block типа указателя объекта не сохраняется блоком при копировании блока.
0 голосов
/ 04 марта 2013

Только с утверждением выше модификатор __block ничего не сделает.Однако в контексте блока __block позволяет блокам, определенным в этом методе, мутировать переменную.

__block NSString *myString = @"My string";
NSLog(@"myString: %@", myString);


dispatch_async(dispatch_get_main_queue(), ^{
    myString = @"My string changed.";
});

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"myString: %@", myString);
});

В этом примере блоки могут изменить myString для указания новой переменной.Это аналогично передаче переменной по ссылке.Если я уберу модификатор __block из объявления myString, я получу компиляцию, в которой будет сказано: «Переменная не присваивается (отсутствует спецификатор типа __block).

...