使用块?

时间:2016-05-03 11:47:06

标签: ios iphone int block

在一次采访中,我最近注意到我被要求预测代码段的输出。即使我做对了,我也无法解释如何得到它。 这是代码段。

int num =2;
int (^ myblock)(void)=^{
    return num*5;
};

NSLog(@"my block  call 1  %d",myblock());
num = 5;
NSLog(@"my block  call 2  %d",myblock());

任何人都可以解释为什么答案都是10次。? 感谢

4 个答案:

答案 0 :(得分:5)

如果未使用__block标记,则num变量将在块中复制。这意味着外部范围num和内部num实际上保存在内存中的不同地址,而更改一个不会影响另一个。要强制编译器使用相同的地址,请使用__block

标记变量

答案 1 :(得分:1)

除了添加' __ block'之外,块外的变量无法更改。在它之前。所以num总是等于2。

 __block int num =2;

然后你会得到10和25

答案 2 :(得分:1)

在声明之前添加__block关键字,以便您可以访问块内的变量。

 __block int num =2;
    int (^ myblock)(void)=^{
        return num*5;
    };

    NSLog(@"my block  call 1  %d",myblock());
    num = 5;
    NSLog(@"my block  call 2  %d",myblock());

试试这个......

答案 3 :(得分:1)

Ryan Hodson在他的tutorial on Objective-C Blocks:

中说道
  

非局部变量被复制并与块一起存储为const   变量,这意味着它们是只读的。试图分配一个新的   从块内部到make变量的值将抛出一个编译器   错误。

num被定义为非局部变量。

  

将非局部变量复制为常量这一事实意味着a   block不仅可以访问非局部变量 - 它创建了一个   他们的快照。非局部变量被冻结在任何值   它们包含在定义块时,块始终使用它   值,即使非局部变量稍后在程序中发生变化。

如果要将块声明中的num的新值反映为块变量

__block int num =2;  // *** Declared as block variable, value change will effect inside block  ***

让我们只用你的例子来理解它。

非本地(非阻止)变量*

int num =2;
int (^ myblock)(void)=^{
    return num*5;
};

NSLog(@"my block  call 1  %d",myblock());
num = 5;
NSLog(@"my block  call 2  %d",myblock());

结果:

我的座位电话1 10

我的座位电话2 10

阻止变量*

__block int num =2;
int (^ myblock)(void)=^{
    return num*5;
};

NSLog(@"my block  call 1  %d",myblock());
num = 5;
NSLog(@"my block  call 2  %d",myblock());

结果:

我的座位电话1 10

我的座位电话2 25