1. 有哪几种类型的Block?
//有常量Block,堆Block, 栈Block;
int age = 1;
void (^block1)(void) = ^{
NSLog(@"block1");
};
void (^block2)(void) = ^{
NSLog(@"block2:%d",age);
};
NSLog(@"%@/%@/%@",[block1 class],[block2 class],[^{
NSLog(@"block3:%d",age);
} class]);
//输出:__NSGlobalBlock __/__NSMallocBlock __/__NSStackBlock __
//__NSGlobalBlock __ 在数据区
//__NSMallocBlock __ 在堆区
//__NSStackBlock __ 在栈区
static 申明的变量是指针引用,上面的age是自动变量是值传递。
参考资料:Block 本质;
2. 在ARC环境下,在哪几种情况下Block由栈复制到堆?
1). block作为函数返回值时
2). 将block赋值给__strong指针时
3). block作为Cocoa API中方法名含有usingBlock的方法参数时
4). block作为GCD API的方法参数时
比如:
[@[@"1",@"2",@"3"] enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"2"]) {
NSLog(@"smart string is at index %lu",(unsigned long)idx);
*stop = YES;
}
}];
这个数组遍历中含有UsingBlock的方法参数。
``
``
``
``
``
``
``
``