__main_block_copy_0 和 __main_block_dispose_0
当block中捕获对象类型的变量时,我们发现block结构体__main_block_impl_0
的描述结构体__main_block_desc_0
中多了两个参数copy
和dispose
函数,查看源码:
copy
和dispose
函数中传入的都是__main_block_impl_0
结构体本身。
copy
本质就是__main_block_copy_0
函数,__main_block_copy_0
函数内部调用_Block_object_assign
函数,_Block_object_assign
中传入的是person对象的地址,person对象,以及8。
dispose
本质就是__main_block_dispose_0
函数,__main_block_dispose_0
函数内部调用_Block_object_dispose
函数,_Block_object_dispose
函数传入的参数是person对象,以及8。
_Block_object_assign函数调用时机及作用
当block进行copy操作的时候就会自动调用__main_block_desc_0
内部的__main_block_copy_0
函数,__main_block_copy_0
函数内部会调用_Block_object_assign
函数。
_Block_object_assign
函数会自动根据__main_block_impl_0
结构体内部的person
是什么类型的指针,对person
对象产生强引用或者弱引用。可以理解为_Block_object_assign
函数内部会对person
进行引用计数器的操作,如果__main_block_impl_0
结构体内person
指针是__strong
类型,则为强引用,引用计数+1,如果__main_block_impl_0
结构体内person
指针是__weak
类型,则为弱引用,引用计数不变。
_Block_object_dispose函数调用时机及作用
当block从堆中移除时就会自动调用__main_block_desc_0
中的__main_block_dispose_0
函数,__main_block_dispose_0
函数内部会调用_Block_object_dispose
函数。
_Block_object_dispose
会对person
对象做释放操作,类似于release
,也就是断开对person
对象的引用,而person
究竟是否被释放还是取决于person
对象自己的引用计数。