Objective-C的数据块和变量(Objective-C blocks and variable

2019-08-01 09:51发布

我今天使用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);

其正常工作。 我需要改变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);

然而,这是行不通的。 控制台只是打印(null)的三倍。 为什么,这是不行的,它虽然与我的第一段代码工作?

Answer 1:

这是因为该块捕获的变量,并在创建块 (除非你用__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);

例如用__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);

请注意,这是一个有点低效率使用__block如果你实际上并不需要修改块内的变量,并把它反映了外面。



Answer 2:

块捕获array在创建指针。 您可以添加__block修改有块参照捕捉指针,但这通常是昂贵的,不建议使用。 最好是有创建后的数据已准备好块内使用捕捉块。



文章来源: Objective-C blocks and variables