block的內(nèi)存管理
(1)block copy操作
當block在棧上時,并不會對__block變量產(chǎn)生強引用
當block被copy到堆時,會調(diào)用block內(nèi)部的copy函數(shù)
- copy函數(shù)內(nèi)部會調(diào)用
_Block_object_assign
函數(shù) -
_Block_object_assign
函數(shù)會對__block變量形成強引用(retain)
(2)block dispose操作
當block從堆中移除時,會調(diào)用block內(nèi)部的dispose函數(shù)
- dispose函數(shù)內(nèi)部會調(diào)用_Block_object_dispose函數(shù)
-
_Block_object_dispose函數(shù)會自動釋放引用的__block變量(release)
(3)__block變量 和 對象類型 在block內(nèi)部有什么區(qū)別准浴?
區(qū)別:在mallocBlock內(nèi)部,會直接對對象類型根據(jù)修飾符決定是強引用還是弱引用,而對__block修飾的變量會連同block一起拷貝到堆上腔寡,并指向該變量形成強引用,如果有其他的block對該變量引用掌唾,則不再拷貝放前,而是增加引用計數(shù)
當block在棧上時,對它們都不會產(chǎn)生強引用
當block拷貝到堆上時糯彬,都會通過copy函數(shù)來處理它們
① __block變量(假設(shè)變量名叫做a)
_Block_object_assign((void*)&dst->a, (void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);
② 對象類型的auto變量(假設(shè)變量名叫做p)
_Block_object_assign((void*)&dst->p, (void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/);
- 當block從堆上移除時凭语,都會通過dispose函數(shù)來釋放它們
① __block變量(假設(shè)變量名叫做a)
_Block_object_dispose((void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);
② 對象類型的auto變量(假設(shè)變量名叫做p)
_Block_object_dispose((void)src->p, 3/BLOCK_FIELD_IS_OBJECT*/);
(4)被__block修飾的對象類型在block內(nèi)部
block的循環(huán)引用
記錄學(xué)習(xí)內(nèi)容近期停止