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如果您实际上不需要修改块内的变量并将其反射到外部,则使用它的效率会低一些.
| 归档时间: |
|
| 查看次数: |
10246 次 |
| 最近记录: |