iOS中經常用到Block,但是為什么Block總是用copy修飾,不用weak修飾,這要從其內部實現說起。
iOS 內存分布,一般分為:棧區(一般由系統銷毀)、堆區(一般由程序員自主銷毀)、全局區、常量區、代碼區。其實 Block 也是一個 Objective-C 對象,常見的有以下三種 Block:
NSMallocBlock:存放在堆區的 Block
NSStackBlock: 存放在棧區的 Block
NSGlobalBlock: 存放在全局區的 Block
在MRC下,使用copy的時候,才會把Block從棧拷貝到堆中,所以MRC下都是使用copy修飾。
在ARC下,使用copy和strong都會把Block從棧拷貝到堆中。
因為使用weak就是一直在棧block中,等到局部作用域結束,則Block就銷毀,再調用此Block就會出現崩潰。