看到有个面试题上问block的类型,本来以为是以参数和返回值来分类,看到答案是以存放区域来分类的,特地研究了一下
int a = 10;
void(^ blockA)(void) = ^{
NSLog(@"just a blockA");
};
NSLog(@"blockA:%@",blockA);
void(^ blockB)(void) = ^{
NSLog(@"just a block%d",a);
};
NSLog(@"blockB:%@",blockB);
void(^ __weak blockC)(void) = ^{
NSLog(@"just a block%d",a);
};
NSLog(@"blockC:%@",blockC);
ARC下打印结果:
blockA:<__NSGlobalBlock__: 0x109108110>
blockB:<__NSMallocBlock__: 0x600000258c00>
blockC:<__NSStackBlock__: 0x7ffee6af6b88>
当block中未引用变量时(如blockA),会被存放在全局区,这样当其方法return时,block也不会释放。
当block引用变量时(如blockB),ARC状态下会被存放在堆区(MRC状态下会存放在栈区)
当block引用变量且用__weak修饰时,会被存放在栈区
我不知道这个结果有什么用,越来越发现现在的面试就像问你茴字的四种写法一样,有没有用不知道,关键在于考察你是否属于一类人吧。去他妈的,关键一点要记住就是
block属性要用copy修饰,不然赋值之后使用会导致崩溃。
对block执行copy操作会有这三种情况:
在全局的block调用copy什么也不做
在栈上的block调用copy会复制到堆上
在堆上的block调用copy 引用计数增加