IOS面试题(block相关) --- block基础
2022-07-07 本文已影响0人
ShawnAlex
问题1: block的分类
-
NSGlobalBlock:
全局block- 全局区
- 在 Block内部不使用外部变量,或者只使用静态变量和全局变量。
-
NSMallocBlock:
堆block- 堆区
- 在Block内部使用局部变量或者OC属性,并且赋值给
强引用
或者copy
修饰的变量。
-
NSStackBlock:
栈block- 栈区
- 同
NSMallocBlock
,可以在内部使用局部变量或者OC属性。但是不能
赋值给强引用
或者copy 修饰
的变量。
问题2: 什么是 block
block 是将函数
及其执行上下文
封装起来的对象
问题3: 什么是 block调用
block 调用即是函数调用
问题4: 什么场景需要 __block
通常被截获变量需要赋值
操作时候需要添加 __block
修饰符
问题5: 看例子回答结果
NSMutableArray *arr = [NSMutableArray array];
void(^Block)(void) = ^{
[arr addObject:@"123"];
};
Block();
NSLog(@"%@", arr);
答案
["123"]
block正常截获变量 arr, 再进行插入"123" 操作, 结果 ["123"]
验证
问题6: 看例子回答结果
NSMutableArray *arr = [NSMutableArray array];
void(^Block)(void) = ^{
arr = [NSMutableArray arrayWithArray:@[@"123"]];
};
Block();
NSLog(@"%@", arr);
答案
报错, 缺少__block
与问题5的的区别
- 问题5: arr 进行了
使用操作
- 问题6: arr 进行了
赋值操作
block进行赋值操作
与使用操作
是不一样的, 赋值操作 局部变量定义时候需要__block
修饰
问题7: 什么时候需要__block修饰? 什么时候不需要需要__block修饰?
在赋值操作
下
-
需要:
- 基础数据变量
- 对象类型变量
-
不需要:
- 静态变量
- 全局静态变量
- 静态局部变量