Block語法及頁面傳值

Block高級

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()
相關文章
相關標籤/搜索