Block類型是一個C級別的語法和運行機制,是一段代碼塊,只有在被調用的時候纔會執行。它與標準的C函數類似,不同之處在於,它除了有可執行代碼以外,它還包含了與堆、棧內存綁定的變量。因此,Block對象包含着一組狀態數據,這些數據在程序執行時用於對行爲產生影響。
可以定義成變量
可以當參數傳遞
可以定義成屬性
block:類似於一個"閉包", 閉包:可以從函數外部訪問函數內部的變量.將block當做一個代碼塊來使用.
block相比於函數的優點: block 可以當做一個參數傳遞而函數/方法不能.
關於block使用中的幾點注意:
1.在使用block前需要對block指針做判空處理.不判空直接使用,一旦指針爲空直接產生崩潰
2.block定義屬性的時候要使用copy.
原因 : 定義的block變量默認是在棧區,棧區的數據是系統控制的,程序員無法控制,當發生內存警告的時候,棧區中的數據有可能被釋放,當程序員想使用block中的數據的時候有可能就不存在了,所以應該用copy在堆區copy一份.
3.block中使用 self ,要使用 self 的弱引用寫法(防止循環引用) __weak typeof(self) weakSelf = self;
關於循環引用要注意一點,在NSOperation中會存在循環引用,但因爲操作執行完就自動銷燬,所以此處block中可以出現 self,大家以後可以用到block就加上一句
__weak typeof(self) weakSelf = self;