block的使用通常須要注意如下幾個細節:c++
NSObject *obj = [[NSObject alloc] init];
int age = 10;
void(^block)(void) = ^{
NSLog(@"block -- %d",age);
NSLog(@"obj-class -- %@",[obj class]);
};
block();
複製代碼
如下是對局部變量obj對象和age(int)的捕獲,ARC下block內部持有外部變量會自動進行copy操做spa
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
int age;
NSObject *__strong obj;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _age, NSObject *__strong _obj, int flags=0) : age(_age), obj(_obj) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
int age = __cself->age; // bound by copy
NSObject *__strong obj = __cself->obj; // bound by copy
NSLog((NSString *)&__NSConstantStringImpl__var_folders_ls_y2bpmhkn2ljfgjl8ylw94ls40000gn_T_main_7248b8_mi_0,age);
NSLog((NSString *)&__NSConstantStringImpl__var_folders_ls_y2bpmhkn2ljfgjl8ylw94ls40000gn_T_main_7248b8_mi_1,((Class (*)(id, SEL))(void *)objc_msgSend)((id)obj, sel_registerName("class")));
};
複製代碼