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修飾符仍然是最為合適的。
