gpt4 book ai didi

Objective-C block 和变量

转载 作者:太空狗 更新时间:2023-10-30 03:30:33 26 4
gpt4 key购买 nike

我今天开始使用 Objective-C 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);

哪个工作正常。不过,我需要在声明后更改 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)。为什么它不起作用,而它确实适用于我的第一段代码?

最佳答案

这是因为 block 按值创建 block 时捕获变量(除非您使用__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 内的变量并将其反射(reflect)在外部,则使用 __block 的效率会稍低一些。

关于Objective-C block 和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com