iOS中block的簡單內存分析

block的聲明與實現 ? 形式如下 ?第一種形式

block的聲明與實現

第二種形式 ?先定義個block類型,大多數情況下也采用這種形式


在block中訪問外部變量

如果你在一個block塊中僅僅訪問對象,而不是對他進行修改操作,是沒有任何問題的,但是修改的話就會報錯


訪問外部變量會報錯

根據猜測,在block生成的同時會對內部使用的變量copy一份,可通過打印變量地址得道驗證


改變了內存地址

如果要在block內部使用外部變量,需要在變量前用__block來修飾,那么__block做了什么?通過如下代碼不難發現__block只做了一件事


如果用__block修飾后 ?block內部會使用原先的那份內存 ?否則就會使用拷貝后的內存 ? 原先的那塊內存雖然值改變了 ?但并不影響內部拷貝后內存的值

一點一點擴展:

由此我們可以推測,如果block中使用的是指針,我們可以直接修改,如果不是的話需要用__block


block循環引用:

先來一個循環引用的案例 (編譯器已經警告提示了,會造成內存泄漏)

而下面這段代碼就不會有警告


因為self并為對GCD的這段block代碼產生強引用

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

推薦閱讀更多精彩內容