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

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


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修饰符的对象也会被复制到堆上。

你可能感兴趣的:(Objective-C的Block实质与实现探究 part-6)