Block的本质

作者: 南城同學 | 来源:发表于2019-08-22 18:03 被阅读0次
Block的本质:
  • block本质上也是一个OC对象,它内部也有个isa指针;
  • block是封装了函数调用以及函数调用环境的OC对象;

Block的数据结构
Block的数据结构
block的变量捕获(capture)
  • 为了保证block内部能够正常访问外部的变量,block有个变量捕获机制;
    1.局部变量需要捕获;
    2.全局变量不需要捕获,直接访问就可以。
捕获机制
局部变量
        // auto:自动变量,离开作用域就销毁
        //默认就是auto
        auto int age = 10; 
        static int height = 10;
        void (^block)(void) = ^{
            // age的值捕获进来(capture)
            NSLog(@"age is %d, height is %d", age, height);
        };
        age = 20;
        height = 20;
        block();
  • 打印结果是:age = 10; height = 20。
  • 底层结构如下:
struct __test_block_impl_0 {
  struct __block_impl impl;
  struct __test_block_desc_0* Desc;
  int age;
  int *height;
  __test_block_impl_0(void *fp, struct __test_block_desc_0 *desc, int _age, int *_height, int flags=0) : age(_age), height(_height) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

1> 创建block的时候,直接 auto修饰 的age封装到了block中了,block外再修改,不会影响block内部的age;
2> static修饰的height,传到block内部的是一个指针;外部修改,也会影响block内部的结果。

为何这样设置 ?
  • 因为 auto修饰的局部变量在栈上,离开作用域后就会销毁;如果也采用指针访问,那此时访问到的就是垃圾数据。
扩展 :self 会被捕获吗 ?
- (void)test {
    void (^block)(void) = ^{
        NSLog(@"-------%p", self);
    };
    block();
}
  • 会;
  • self其实是一个参数,参数是一个局部变量。
// test函数完整写法如下:
- (void)test(Object *self, SEL _cmd) {
}


相关文章

  • Block总结

    一、Block的底层结构及本质 (1)block本质: 从代码可以看出,Block的本质就是NSObject. 也...

  • OC底层原理(八):Block

    block是经常使用的一种技术,那么block的本质是什么呢? Block的本质 block本质上也是OC对象,它...

  • 理清 Block 底层结构及其捕获行为

    来自掘金 《理清 Block 底层结构及其捕获行为》 Block 的本质 本质 Block 的本质是一个 Obje...

  • Block详解-小码哥

    block本质 block的本质是封装了函数调用和函数调用环境的OC对象。 block结构 Block_layou...

  • iOS-底层原理28:block底层原理

    本文主要介绍:1、block的本质2、block捕获变量3、block的类型4、__block原理 本质 通过cl...

  • block系列文章总结

    iOS源码解析:Block的本质<一>iOS源码解析:Block的本质<二>Objective C block背后...

  • Block详解

    block的本质 先看block的简单实现 转为C++代码 查看Block的继承关系 结论: block本质上也是...

  • 2019 知识点总结

    1、Block 释放 追问 (1)Block本质? Block本质就是一个OC对象,内部有isa指针。 Block...

  • 06-OC中block的底层原理

    06-block的本质 在讲解block的底层原理前,我们先抛出如下block相关的问题: block的本质,底层...

  • iOS Block详解

    第一部分:Block本质 Q:什么是Block,Block的本质是什么? block本质上也是一个OC对象,它内部...

网友评论

    本文标题:Block的本质

    本文链接:https://www.haomeiwen.com/subject/bfsosctx.html