Objective-C的Block实质与实现探究 part-6

Block使用__block�变量,且该变量为对象的情况

</br>

typedef void (^blk_t)(id);

blk_t blk;

{
    __block id array = [[NSMutableArray alloc] init];
    blk = [^(id obj) {
        
        [array addObject: obj];

        NSlog(@"array count = %ld", [array count]);

    } copy];
}

blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);

转换为C++:

struct __Block_byref_obj_0 {
    void *__isa;
    __Block_byref_obj_0 *__forwarding;
    int __flags;
    int __size;
    void (*__Block_byref_id_object_copy)(void *, void *);
    void (*__Block_byref_id_object_dispose)(void *);
    __strong id obj;
};

static void __Block_byref_id_object_copy_131(void *dst, void *src) {
    _Block_object_assign((char *)dst + 40, *(void **)((char *)src + 40), 131);
}

static void __Block_byref_id_object_dispose_131(void *src) {
    _Block_object_dispose(*(void **) ((char *)src + 40), 131);
}

__Block_byref_obj_0 = {
    0,
    &obj,
    0x2000000,
    sizeof(__Block_byref_obj_0),
    __Block_byref_id_object_copy_131,
    __Block_byref_id_object_dispose_131,
    [[NSObject alloc] init]
};

虽然与截获对象时和使用__block变量时的代码稍有不同,但仍看到有copy函数和dispose函数。所以Block从栈复制到堆上时,对有__block修饰符的对象也会被复制到堆上。

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

推荐阅读更多精彩内容