IOS 中 Block一探究竟

诠释:封装函数及上下文的对象(匿名函数 其本质是结构体)

分类:__NSMallocBlock__  堆

            __NSGlobalBlock__ 全局

            __NSStackBlock__  栈

 __NSGlobalBlock__ 全局

global

__NSMallocBlock__  堆

malloc

 __NSStackBlock__  栈

stack

                                                            二、循环引用


循环引用

这就是常见的循环引用,怎么解决呢--- 我认为用weak  看代码

截图

好像真的解决了,警告没有了,继续往下看

例:有A,B两个页面 ,我们在B界面写了一个Block,Block模块中有延迟操作,此时用户返回A界面


截图

此时name为null,这是为什么?

因为弱引用 在作用空间内 随时是可以释放的

继续

防止提前释放:在当前作用域内临时持有

__strongtypeof(self) strongSelf = weakSelf;

截图

                                                       方法||

__block 捕获局部变量法

截图

                                                                             方法|||

block传参


截屏

block 底层探究:

创建一个c文件,把终端切到c文件的目录下,gcc编译 ----> clang编译把oc代码转成c/c++代码以cpp后缀文件输出

1. gcc xxx.c 2.clang -rewrite-objc xxx.c -o xxx.cpp


截图
截图

__main_block_impl_0 这个就是block 真身 是一个结构体,有四项内容,如上如所示,下面我们用block捕获局部变量,再编译看有什么不同


截图

__block 把局部变量 包装成结构体对象,局部变量的指针,值 都赋值给了结构体,通过block结构体构造函数(block(结构体)内部也会生成一个结构体对象指针,并且赋值给block(结构体)的属性)block(结构体)执行属性函数,通过传递过去的block参数,拿到结构体属性进行操作

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容