int val = 0 ; void (^blk)(void) = ^{ val = 1; };
int global_val = 1; static int static_global_val= 2; int main () { static int static_val =3; void (^blk)(void) = ^{ global_val *= 1; static_global_val *= 2; static_val *=3; }; return 0; }
int global_val = 1; static int static_global_val= 2; struct __block_impl { void * isa; int Flags; int Reserved; void *FuncPtr; }; struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0 *Desc; int *static_val; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int *_static_val, int flags = 0):static_val(_static_val) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } }; static void __main_block_func_0 (struct __main_block_impl_0 *__cself) { int *static_val = __cself ->static_val; global_val *= 1; static_global_val *= 2; (*static_val) *= 3; } static struct __main_block_desc_0 { unsigned long reserved; unsigned long Block_size; } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0) }; int main() { static int static_val = 3; blk = & __main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, &static_val); return 0; }
__block int val = 1; void (^blk)(void) = ^{ val = 1; };
struct __block_impl { void * isa; int Flags; int Reserved; void *FuncPtr; }; struct __main_byref_val_0 { void *__isa; __Block_byref_val_0 *__forwarding; int __flags; int __size; int val; }; struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0 *Desc; __Block_byref_val_0 *val; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_val_0 *val, int flags = 0):val(i_val->__forwarding) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } }; static void __main_block_func_0 (struct __main_block_impl_0 *__cself) { __Block_byref_val_0 *val = __cself ->val; val->__forwarding->val = 1; } static void __main_block_copy_0 (struct __main_block_impl_0 *dst, struct __main_block_impl_0 *src) { _Block_object_assign (&dst->val, src->val, BLOCK_FIELD_IS_BYREF); } static void __main_block_dispose_0(struct __main_block_imp1_0 *src) { _Block_object_dispose(src->val, BLOCK_FIELD_IS_BYREF); } static struct __main_block_desc_0 { unsigned long reserved; unsigned long Block_size; void (*copy)(struct __main_block_impl_0 *, struct __main_block_impl_0 *); void (*dispose)(struct __main_block_impl_0*); } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0; __main_block_dispose_0; }; int main() { __Block_byref_val_0 val ={0, &val, 0, sizeof(__Block_byref_val_0), 10}; static int static_val = 3; blk = & __main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, &val, 0x22000000); return 0; }
类 | 设置对象的存储域 |
_NSConcreteStackBlock | 栈 |
_NSConcreteGlobalBlock | 程序的数据区域(.data区) |
_NSConcreteMallocBlock | 堆 |
【Objective-C高级编程】iOS与OS X多线程和内存管理(六) __block 说明符,布布扣,bubuko.com
【Objective-C高级编程】iOS与OS X多线程和内存管理(六) __block 说明符
原文:http://blog.csdn.net/mad2man/article/details/21776173