- 下面代码会输出什么?
int a = 3;
void (^myblock)(void) = ^(){
NSLog(@"%d",a);
};
myblock();
a = 4;
myblock();
// 正确结果: 3 3
通过打印的地址得知, 在Block内部和外部变量a的地址不一样, Block内部对变量a进行了默认copy操作, 外部变量a的值的改变不会影响到Block内部. 并且copy后的值存放于堆区(尚待验证).
Tips:
1). Block内部不能直接修改外部变量的值, 如果修改需要在外部变量定义前加上关键字 _ _block ;
2). Block内部可以定义和Block外部相同名的变量, 此时内部的变量会在Block作用域内暂时屏蔽外部变量, 且内部定义的变量也在栈区.
- nil, Nil, NSNull, NULL分别用在什么场合?
iOS中的四大皆空:
标志 | 值 | 含义 |
---|---|---|
NULL |
(void *) 0 | C指针的字面零值 |
nil |
(id) 0 | Object-C对象的字面零值 |
Nil |
(Class) 0 | Object-C类的字面零值 |
NSNull |
[NSNull null] | 用来表示零值的单独的对象 |