Objective-C块和变量

Tim*_*len 8 variables objective-c objective-c-blocks

我今天开始使用Objective-C块.我写了以下代码:

NSArray *array = @[@25, @"abc", @7.2];

void (^print)(NSUInteger index) = ^(NSUInteger index)
{
    NSLog(@"%@", array[index]);
};

for (int n = 0; n < 3; n++)
    print(n);
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.我需要array在声明后更改变量,所以我尝试使用以下代码:

NSArray *array;

void (^print)(NSUInteger index) = ^(NSUInteger index)
{
    NSLog(@"%@", array[index]);
};

array = @[@25, @"abc", @7.2];

for (int n = 0; n < 3; n++)
    print(n);
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.控制台只打印(null)三次.为什么这不起作用,而它确实与我的第一段代码一起工作?

Wev*_*vah 20

这是因为块按值捕获变量以及何时创建块(除非您使用__block).

你可能想要的是:

NSArray *array = @[@25, @"abc", @7.2];

void (^print)(NSUInteger index) = ^(NSUInteger index)
{
    NSLog(@"%@", array[index]);
};

for (int n = 0; n < 3; n++)
    print(n);
Run Code Online (Sandbox Code Playgroud)

示例__block:

__block NSArray *array;

void (^print)(NSUInteger index) = ^(NSUInteger index)
{
    NSLog(@"%@", array[index]);
};

array = @[@25, @"abc", @7.2];

for (int n = 0; n < 3; n++)
    print(n);
Run Code Online (Sandbox Code Playgroud)

请注意,__block如果您实际上不需要修改块内的变量并将其反射到外部,则使用它的效率会低一些.

  • `__block`告诉编译器通过引用捕获变量,因此您可以在块内修改它,并在块外部显示新值.(我将在__block中添加一个示例.) (4认同)
  • `__block`通过引用捕获变量.**编辑:**两次都被殴打.:) (2认同)