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中也無需遵守協議,只需要調用函數即可