static int static_i = 2000;
int local_i = 100;
__block int a = 1;
__block NSObject *obj = [[NSObject alloc] init];
void (^block)(void)= ^(void){
local_i;
static_i;
a--;
obj;
};
block();
a++;
obj;
clang -rewrite-objc -fobjc-arc main.m
//__block int a
struct __Block_byref_a_0 {
void *__isa;
__Block_byref_a_0 *__forwarding;
int __flags;
int __size;
int a;
};
//__block NSObject *obj
struct __Block_byref_obj_1 {
void *__isa;
__Block_byref_obj_1 *__forwarding;
int __flags;
int __size;
void (*__Block_byref_id_object_copy)(void*, void*);
void (*__Block_byref_id_object_dispose)(void*);
NSObject *__strong obj;
};
//block結(jié)構(gòu)體
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
//捕獲到的局部變量
__Block_byref_a_0 *a; // by ref
__Block_byref_obj_1 *obj; // by ref
int local_i;
__main_block_impl_0(
void *fp,
struct __main_block_desc_0 *desc,
int _local_i,
__Block_byref_a_0 *_a,
__Block_byref_obj_1 *_obj,
int flags=0) : local_i(_local_i), a(_a->__forwarding), obj(_obj->__forwarding) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
//block - fp
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
__Block_byref_a_0 *a = __cself->a; // bound by ref
__Block_byref_obj_1 *obj = __cself->obj; // bound by ref
int local_i = __cself->local_i; // bound by copy
local_i;
static_i;
(a->__forwarding->a)--;
(obj->__forwarding->obj);
}
//此處省略若干代碼
//__block int a = 1
__attribute__((__blocks__(byref))) __Block_byref_a_0 a =
{(void*)0, (__Block_byref_a_0 *)&a, 0, sizeof(__Block_byref_a_0), 1};
//__block NSObject *obj = [[NSObject alloc] init];
__attribute__((__blocks__(byref))) __Block_byref_obj_1 obj =
{(void*)0, (__Block_byref_obj_1 *)&obj, 33554432, sizeof(__Block_byref_obj_1),
__Block_byref_id_object_copy_131,
__Block_byref_id_object_dispose_131,
((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"))};
void (*block)(void)= ((void (*)())&__main_block_impl_0(
(void *)__main_block_func_0,
&__main_block_desc_0_DATA,
local_i,
(__Block_byref_a_0 *)&a,
(__Block_byref_obj_1 *)&obj,
570425344))();
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
(a.__forwarding->a)++;
(obj.__forwarding->obj);
__forwarding
Block沒有執(zhí)行過copy時赶舆,
__forwarding
指向自己Block執(zhí)行過copy后,棧與堆中的
block_ref_obj.__forwarding
都指向堆中的block_ref
結(jié)論
未加__block修飾符時询微,傳遞給block的是值
帶有__block修飾符時,傳遞給block的是Block_byref
類型的指針