Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C模块和变量_Objective C_Variables_Objective C Blocks - Fatal编程技术网

Objective-C模块和变量

Objective-C模块和变量,objective-c,variables,objective-c-blocks,Objective C,Variables,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); NSArray *array; void (^print)(NSUInteger

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

然而,这是行不通的。控制台只打印三次
(空)
。为什么这不起作用,而我的第一段代码却起作用了?

这是因为块在创建块时按值捕获变量(除非使用
\u 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);

请注意,如果实际上不需要修改块内的变量并将其反映到块外,则使用
\uu块的效率会稍低。

块在创建时捕获
数组
指针。您可以添加
\u块
修改器,使块通过引用捕获指针,但这通常成本较高,不推荐使用。最好在数据准备好在块内使用后创建捕获块。

使用_块有什么区别?
_块
告诉编译器通过引用捕获变量,以便您可以在块内修改它,并在块外显示新值。(我将添加一个带有_block的示例。)
_block
通过引用捕获变量。编辑:两次都被打败。:)谢谢,用
\u block
帮我完成了。实际上,我需要修改块中的变量,现在可以正常工作了。:)我试着用这段代码修改块内的变量,但打印三个空值,知道吗__块NSMUTABLEARRY*数组;void(^print)(NSUInteger索引)=^(NSUInteger索引){[array addObject:@“444”];NSLog(@“%@”,array[index]);};[数组addObject:@“111”];[数组addObject:@“222”];[数组addObject:@“333”];对于(int n=0;n<3;n++)打印(n);有意思你有没有举个例子?
__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);