Block有三種類型:
我們在講 block的本質 的時候已經知道了,block的本質就是壹個 OC 對象,那麽既然它是壹個 OC 對象,它就會有類型,本文就將講解 block 的三種類型.並都繼承於NSBlock
我們在講 block 的三種類型之前,先了解壹下程序的內存分配情況,因為不同類型的 block 分配的內存也不同.
結論: 沒有訪問 auto變量 的block 就是 __NSGlobalBlock
結論:訪問了auto變量 的block 就是 __NSStackBlock
怎麽打印的是 NSMallocBlock ,剛才不是說訪問了auto變量就是__NSStackBlock嗎?
因為這裏我們使用的是ARC,在ARC環境下,Xcode編譯器再某些情況會默認幫我們做調用copy 變成堆block ,我們在Build Settings中把ARC設置成MRC,再來打印壹下:
這次打印的就是 NSStackBlock
我們思考壹下,__NSStackBlock在訪問外部變量時,會有什麽問題?
會出現野指針crash 所以在ARC壞境Xcode幫我們處理成了堆block( NSMallocBlock )防止出現釋放了還去訪問導致野指針crash
結論: 當壹個__NSStackBlock調用了copy操作,返回的就是壹個__NSMallocBlock
以上都是在MRC環境下
如果是在ARC環境下,編譯器會根據情況自動將棧上的block復制到堆上 , 比如以下幾種情況:
1:壹***有三種類型的Block.分為__NSGlobalBlock,__NSStackBlock,__NSMallocBlock.
沒有訪問 auto變量 的block 就是 __NSGlobalBlock
訪問了auto變量 的block 就是 __NSStackBlock
當壹個__NSStackBlock調用了copy操作,返回的就是壹個__NSMallocBlocksing
2:在ARC環境下,編譯器會自動把棧上的block copy到堆上