当block在栈上时,并不会对__block变量产生强引用
当block被copy到堆时
- 1.会调用block内部的
copy函数 - 2.copy函数内部会调用
_Block_object_assign函数 - 3.
_Block_object_assign函数会对__block变量形成强引用(retain)

当block从堆中移除时
- 1.会调用
block内部的dispose函数 - 2.
dispose函数内部会调用_Block_object_dispose函数 - 3.
_Block_object_dispose函数会自动释放引用的__block变量(release)


对象类型的auto变量、__block变量
当block在栈上时,对它们都不会产生强引用
当block拷贝到堆上时,都会通过copy函数来处理它们
1.__block变量(假设变量名叫做a)
_Block_object_assign((void*)&dst->a, (void*)src->a, 8
/BLOCK_FIELD_IS_BYREF/);
2.对象类型的auto变量(假设变量名叫做p)
_Block_object_assign((void*)&dst->p, (void*)src->p, 3
/BLOCK_FIELD_IS_OBJECT/);
3.当block从堆上移除时,都会通过dispose函数来释放它们
__block变量(假设变量名叫做a)
_Block_object_dispose((void*)src->a, 8
/BLOCK_FIELD_IS_BYREF/);
4.对象类型的auto变量(假设变量名叫做p)
_Block_object_dispose((void*)src->p, 3
/BLOCK_FIELD_IS_OBJECT/);
int age // 占用4个字节 指针占用8个字节