Block為什么不能用weak修飾

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就會出現崩潰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容