【iOS面试粮食】Block

2019-12-19  本文已影响0人  KaironZz

本文章将记录Objective-C中Block的相关资料,如有错误欢迎指出~

Block的本质

Block本质.png

Block 实际上就是一个OC对象(结构体中有 isa 指针),这个对象封装了函数,以及函数执行的上下文

Block的变量捕获

为了保证block内部能够正常访问外部的变量,block有一个变量捕获机制。block捕获外部变仅仅只捕获Block闭包里面会用到的值,其他用不到的值,它并不会去捕获。

局部变量

看下简单的代码输出

auto int age = 10;
static int num = 25;
void (^Block)(void) = ^{
    NSLog(@"age:%d,num:%d",age,num);
};
age = 20;
num = 11;
Block();

// log   age = 10
                 age = 11

为什么两种变量会有这种差异呢?

因为自动变量可能会销毁,block在执行的时候有可能自动变量已经被销毁了,那么此时如果再去访问被销毁的地址肯定会发生坏内存访问,因此对于自动变量一定是值传递而不可能是指针传递了。

而静态变量不会被销毁,所以完全可以传递地址。而因为传递的是值得地址,所以在block调用之前修改地址中保存的值,block中的地址是不会变得。所以值会随之改变。

全局变量

因为全局变量无论在哪里都可以访问,所以block不需要捕获全局变量

变量类型

总结:

Block的类型

OC中,一般Block就分为以下3种类型

Block的类型.png

Block的循环引用

这篇文章讲的挺不错的Block 与 self 的那点事(iOS)

面试题

面试题请参考 这篇文章 iOS-Block相关面试题

参考

iOS底层原理总结 - 探寻block的本质(一)

iOS block 捕获外部变量以及注意点

上一篇 下一篇

猜你喜欢

热点阅读