Block:塊語法,本質上是匿名函數,標準的C裏面是沒有Block的,C語言的後期擴展版本加入了匿名函數web
Block語法:數組
int(^myBlock)(int) = ^(int a){ return a;};函數
myBlock是block變量,^符號是將myBlock聲明爲一個塊對象 int(^)(int)是myBlock的類型。 ^(int a){return a;};是Block值spa
Block進行typedef代理
typedef int(^BlockType)(int a,int b)指針
原類型:int(^)(int a,int b)code
新類型:BlockType對象
採用新類型聲明Block變量排序
BlockType block = ^(int a,int b){ return a+b;};Block訪問外部變量內存
Block能夠訪問和修改全局變量,可是隻能訪問局部變量不能修改局部變量,若要修改局部變量要對局部變量外加__block修飾。
Block的應用
(1)使用block進行數組排序
(2)實現函數回調功能(即調用)
(3)用於頁面之間的通訊,同時能夠傳值
block頁面傳值的好處:不用設置代理,取代了代理的做用
簡單敘述頁面傳值的步驟
在第二個頁面聲明block變量,當第一個頁面跳轉至第二個頁面時,創 建第二個頁面後也給第二個頁面的block變量賦值(塊內部實現可將第 二個頁面的值傳至第一個頁面),而後在第二個頁面回調改函數Block的內存問題
定義屬性接受Block,必須使用copy修飾,retain和assign會形成野指針的問題。由於Block在某個方法中定義時存儲在了棧區,在另外一個類中使用時要建立是存儲在堆區因此應該使用copy修飾。 在block的實現部分,不能直接食用實例變量,self調用屬性,由於block會形成self引用計數加1,致使循環引用問題。 MRC寫法:__block typeof(self) BlockSelf = self; ARC寫法:__weak typeof(self) WeakSelf = self; 在dealloc中要使用對應的Block_release()