iOS之Block(二)

1. block的原理本质

之前简单说一下block的定义和基本的使用可以点击这边查看

  • block的本质是一个OC对象,其内部也是有isa指针指向
  • block这个对象其实是封装了函数调用和函数调用的环境

我们定义一个简单的block,通过终端把mian.m文件转化为c++文件来查看里面的代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
上面的 命令可以 转化为c++ 代码

在这里插入图片描述
在这里插入图片描述

2.block对变量的捕获

2.1.局部变量
  • 局部变量:离开作用域自动销毁, 值传递
  • static 修饰局部变量 指针传递
2.2.全局变量
3.block的类型
3.1 继承类型

继承顺序 __NSMallocBlock__ ->__NSMallocBlock -> NSBlock ->NSObject

 int a = 10;
        void(^block)(void) = ^{

            NSLog(@"测试--%d",a);
        };

       
        Class blockCls = object_getClass(block);
        while (blockCls) {
            NSLog(@"类型%@",blockCls);
            blockCls = class_getSuperclass(blockCls);
        }
        

3.2 block的分类
  • __NSGlobalBlock__ 没有访问auto变量的block都是这个类型
  • __NSStaticBlock__ 访问auto变量的block都是这个类型 【前提是在MRC的环境下】,【如果在ARC情况下是__NSMallocBlock__,因为在ARC系统会自动调用一次 copy讲在 栈区变换到堆区
  • __NSMallocBlock____NSStaticBlock__调用copy

在这里插入图片描述

代码段:直接存放代码
数据: 全局变量存放到 数据段
: 一般存放动态分配内存 alloc开辟的,需要开发者申请内存和管理内存
:一般存放局部变量,系统自动分配内存,自动销毁

ARC情况下,系统会自动将block,copy一次放到
比如:GCD中block的参数

4.修改在block内部修改变量
  • 局部变量,在block内部是可以修改的
    在这里插入图片描述

在这里插入图片描述

static修饰 可以更改
全局变量可以修改
__block修饰可以更改


    __block int a = 10;
        
        void(^myblock)(void) = ^{
            a = 5;
            NSLog(@"%d",a);
        };
        
        
        myblock();
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值