美文网首页
1期_iOS-block

1期_iOS-block

作者: 萧修 | 来源:发表于2023-08-07 01:10 被阅读0次

概念:

block本质也是一个OC对象,内部也有isa指针。
block封装了函数调用。

底层数据结构:

将下面这句代码转成底层c++实现

int age = 10;
        void (^block)(void) = ^{
            NSLog(@"age is %d",age);
        };
        block();
  • 切换到目标文件的上级目录
  • 终端命令为 将x换为需要转换的目标文件

clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk x

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
};

struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *Funcptr;
}

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
}

对下面这段代码进行解读

struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *Funcptr;
}

isa:指向所属类的指针,也就是block类型
flags:标志变量,在实现block的内部操作时会用到

block的类型

  • 堆block:堆内存,程序员手动管理
  • 栈block:栈内存,随时会被系统回收,对应的栈block同样会被随时回收

使用copy修饰,将栈block复制到堆上。

  • 全局block:不引用外部变量,或者引用静态变量和全局变量

block的捕获

值类型捕获、引用类型

局部变量,全局变量、

捕获的流程,

——block的使用

block内部修改auto变量的值,无法直接修改,就需要用到__block修饰符。此修饰符无法修饰static以及全局变量

被__block修饰的变量会被包装我结构体对象,结构体中有此变量,有此变量的地址

Block问答题

1、如何区分block类型

  • Block不会捕获全局变量,但是局部变量需要捕获?

全局变量在任何时候任何地方都可以访问,因此不需要捕获,局部变量因为作用域的问题,需要捕获,保证block内部能访问到该变量

  • 使用copy修饰block,内部做了什么?

copy函数内部会调用Block_object_assign函数,此函数会根据auto变量的修饰符(__strong、__weak、__unsafe-unretained)做出相应的操作,类似于retain(形成强引用,弱引用)

相关文章

  • iOS-Block本质

    iOS-Block本质 参考篇:iOS-Block浅谈[https://www.jianshu.com/p/25a...

  • Objective-C的本质(6)——Block本质

    参考:iOS-Block本质iOS底层原理总结 - 探寻block的本质(一)iOS底层原理总结 - 探寻bloc...

  • iOS-block

    一. 查看block内部实现 1.编写block代码void (^DemoBlock)(int, int) = ^...

  • ios-Block

    概述: 能够截取自动变量的匿名函数 指向函数的指针 结构体 oc对象 使用: - 声明 - 定义(变量赋值) - ...

  • iOS-Block

    Block是一种匿名函数,也是一种Objective-C对象。 语法 返回值和参数列表都可以省略 声明 block...

  • iOS-block

    1.相关概念在这篇笔记开始之前,我们需要对以下概念有所了解。1.1 操作系统中的栈和堆注:这里所说的堆和栈与数据结...

  • iOS-Block

    block已经成为我在iOS编写中最为常用的回调方法 , 它简单便捷 , 取代了代理大部分的工作 , 今天整理一下...

  • iOS-block

    一. block的声明、调用、实现 1. block的声明 返回值(^block变量名)(参数); 例如: 2. ...

  • IOS-Block

    Block初探 blcok的分类 不同关键字修饰的变量auto和static在OC中有个默认的关键字auto,在我...

  • iOS-Block

    面试题 block的原理是怎样的?本质是什么? 封装了函数调用以及调用环境的OC对象 __block的作用是什么?...

网友评论

      本文标题:1期_iOS-block

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