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