iOS-block用什么修飾符來修飾?為什么?可以用strong來修飾嗎?


iOS-block用什么修飾符來修飾?為什么用copy來修飾呢?用strong來修飾可以嗎?

在ARC下 block 可以用copy 或者 strong來修飾。

為什么用copy來修飾?
      因為block變量默認是聲明為棧變量的,為了能夠在block的聲明域外使用,所以要把block拷貝(copy)到堆。
      block本質是對象,可以retain,和release。但是,block在創建的時候,它的內存是分配在棧上的,而不是在堆上。他本身的作於域是屬於創建時候的作用域,一旦在創建時候的作用域外面調用block將導致程序崩潰。因為棧區的特點就是創建的對象隨時可能被銷毀,一旦被銷毀后續再次調用空對象就可能會造成程序崩潰。在對block進行copy后,block存放在堆區. 使用retain也可以,但是block的retain行為默認是用copy的行為實現的,

ARC下, 使用copy與strong其實都一樣, 因為block的retain就是用copy來實現的, 所以在ARC下 block使用copy 和 strong 都可以

 

實驗看下:
ARC下strong修飾block,且不引用外部變量,block類型為__NSGlobalBlock

 
ARC下strong修飾block,引入外部變量,block類型為__NSMallocBlock

 

所以由此就可以理解為ARC下strong修飾的block並沒有處於棧區的可能,也就不存在作用域結束棧區內容銷毀野指針的問題了。 但是為了保證修飾符和block特性的一致性,使用copy修飾符仍然是最為合適的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM