Обычно, когда вы не используете __block, блок копирует (сохраняет) переменную, поэтому, даже если вы измените переменную, блок имеет доступ к старому объекту.
NSString* str = @"hello";
void (^theBlock)() = ^void() {
NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints @"hello"
В этих 2 случаях вам нужно __block:
1.Если вы хотите изменить переменную внутри блока и ожидать, что она будет видна снаружи:
__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
str = @"how are you";
};
theBlock();
NSLog(@"%@", str); //prints "how are you"
2.IfВы хотите изменить переменную после того, как объявили блок, и ожидаете, что блок увидит изменение:
__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints "how are you"