Block

Block

block內存管理

  • 無論是MRC還是ARC,只要block沒有訪問外部變量,blokc始終在全局區

  • MRC情況下

    • block如果訪問外部變量,block在棧里
    • 不能對block進行retain,否則不能保存到堆里
    • 只有使用copy,才保存到堆里
  • ARC情況下

    • block如果訪問了局部變量,block在堆里
    • blokc可以使用copy和strong,并且block是一個對象
  • 如果block訪問的外部變量是局部變量,那么就是值傳遞,外界改了,不會影響里面

  • 如果block訪問的外部變量是__block或者static修飾,或者是全局變量,那么是地址傳遞,外界改了,會影響到block內部

在block中經常會用到外部變量,如果這個block是存儲在堆區,或者被復制到堆區,則對象對應的引用+1,當block釋放后-1

block的循環引用

如果在block內部使用外部強指針經常會引發循環引用,使用以下代碼可以解決
__weak typeof(Self) weakSelf = self;

但是,如果在block內部使用延時操作還使用弱指針的話會取不到該弱指針,因為已經被銷毀了,需要在block內部再將弱指針強引用一下
__strong typeof(self) strongSelf = weakSelf

關于block的定義:獲取其他函數局部變量的匿名函數

使用block完成委托模式的優點:

  • 回調的block代碼塊定義在委托函數內部,使代碼更為緊湊
  • 適配對象不再需要實現某個具體的protocol,代碼更為簡潔

比如我們需要在控制器A與B之間進行傳值,只需要在A中定義一個block屬性,然后把需要傳的值作為block的參數,在B中獲得A的對象,,先判斷他有沒有block屬性,有的話直接調用,然后通過回調就可以獲取A控制器里的值,這樣的好處就是所有邏輯代碼都寫在A內部,在B中也無需遵守協議,只需要調用函數即可

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

推薦閱讀更多精彩內容