block有如下三種類(lèi)型:
__NSGlobalBlock __ ( _NSConcreteGlobalBlock )(全局區(qū)內(nèi)存)
__NSStackBlock __ ( _NSConcreteStackBlock )(棧區(qū)內(nèi)存)
__NSMallocBlock __ ( _NSConcreteMallocBlock )(堆區(qū)內(nèi)存)
block在MRC和ARC環(huán)境下分別出現(xiàn)這三種類(lèi)型的情況
MRC環(huán)境:
__NSGlobalBlock:沒(méi)有訪問(wèn)外部auto變量,如果訪問(wèn)了外部static或者全局變量也是這種類(lèi)型
__NSStackBlock:訪問(wèn)了外部auto變量
__NSMallocBlock:__NSStackBlock類(lèi)型調(diào)用了copy方法
上面就是MRC環(huán)境下的三種類(lèi)型,如果對(duì)__NSGlobalBlock和__NSMallocBlock分別調(diào)用copy會(huì)是什么情況呢?
__NSGlobalBlock調(diào)用copy還是__NSGlobalBlock類(lèi)型垂攘,__NSMallocBlock調(diào)用copy則引用計(jì)數(shù)+1
再看下ARC環(huán)境下的三種類(lèi)型:
__NSGlobalBlock:和MRC環(huán)境一樣陨仅,不再累贅
__NSStackBlock:訪問(wèn)了外部變量,但沒(méi)有強(qiáng)引用指向這個(gè)block颖侄,而是直接打印出來(lái)
__NSMallocBlock:ARC環(huán)境下只要訪問(wèn)了外部auto變量而且有強(qiáng)引用指向該block(或者作為函數(shù)返回值)就會(huì)自動(dòng)將__NSStackBlock類(lèi)型copy到堆上