IOS面试题(block相关) --- block基础

OC面试题目合集地址

问题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修饰?

赋值操作

  • 需要:
    • 基础数据变量
    • 对象类型变量
  • 不需要:
    • 静态变量
    • 全局静态变量
    • 静态局部变量

你可能感兴趣的:(IOS面试题(block相关) --- block基础)