當前位置:編程學習大全網 - 編程語言 - ios中block的三種形式

ios中block的三種形式

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到堆上

  • 上一篇:三目運算符的用法
  • 下一篇:利率跟黃金價格有什麽關系?
  • copyright 2024編程學習大全網