在一次采访中,我最近注意到我被要求预测代码段的输出。即使我做对了,我也无法解释如何得到它。 这是代码段。
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次。? 感谢
答案 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