iOS中Block实现的探究(一)

本文详细解析了iOS开发中block的实现方式,特别是如何在函数内部使用局部变量和全局(或静态)变量,并通过代码实例展示了编译过程中的中间代码。了解这些细节有助于开发者更高效地利用block特性,提高代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是学习jasonblog的《iOS中block实现的探究》一文的笔记,是在自己理解的基础上写的注释,不知是否有谬误之处,盼指正。

原文: http://blog.youkuaiyun.com/jasonblog/article/details/7756763?reload


下面是对于block中使用到局部变量、全局变量(或静态变量)这两种情况的理解。篇(二)中将会是对__block变量和其他方面的理解。


int globalInt = 0;

- (void)test {
    
    int localInt = 3;
    void (^blk)() = ^{
        globalInt += localInt;
        printf("globalInt + localInt = %d\n", globalInt);
    };
    blk();
}

// -------------------以下为上函数编译过程中的中间代码------------------- //

// block自身类
struct __block_impl {
    void *isa; // block的类型,在堆上还是在栈上 &_NSConcreteStackBlock在栈上、&_NSConcreteGlobalBlock在堆上
    int Flags;
    int Reserved;
    void *FuncPtr; // 指向block实现函数的指针(本例中指向函数static void __test_block_func_0(...))
};

// block--blk的类
// 类名根据所在函数(test函数)以及出现序列(第0个)进行命名。如果是全局block,就根据变量名和出现序列进行命名。
struct __test_block_impl_0 {
    struct __block_impl impl;
    struct __test_block_desc_0 *Desc; // 描述信息
    int localInt; // 局部变量
    int *globalInt; // 全局变量或静态变量会在这里有一个对应的指针
    __test_block_impl_0(void *fp, struct __test_block_desc_0 *desc, int _localInt, int *_globalInt, int flags = 0): localInt(_localInt), globalInt(_globalInt) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
    }
};

// block对应的函数体
static void __test_block_func_0(struct __test_block_impl_0 *__cself) { // block对应的函数体。__cself为block自身
    int localInt = __cself -> localInt;
    int *globalInt = __cself -> globalInt;
    (*globalInt) += localInt;
    printf("globalInt + localInt = %d\n", (*globalInt));
}

// 描述信息
static struct __test_block_desc_0 {
    unsigned long reserved;
    unsigned long Block_size;
} __test_block_desc_0__DATA = {0, sizeof(struct __test_block_impl_0)};

void test() {
    int localInt = 3;
    __test_block_impl_0 impl = __test_block_impl_0((void *)__test_block_func_0, &__test_block_desc_0__DATA, localInt, &globalInt);
    void (*blk)(void) = (void (*)(void))&impl;
    ((void (*)(struct __block_impl *))((struct __block_impl *)blk) -> FuncPtr)((struct __block_impl *)blk);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值