Block用法解析

2021-12-30 08:30:37 字數 1707 閱讀 2279

block**塊是對c做出的乙個補充,初次體驗**塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給**帶來層次上的提公升。block就是一段在將來被執行的**

^[塊返回值型別](形參型別1 形參1,形參型別2 形參2,...)

塊返回值型別 (^塊變數名)(形參型別1,形參型別2,...);//定義塊變數

void(^nslogstr)();

//通過塊變數呼叫塊

nslogstr=^(void)

;//定義無返回值不帶引數

void (^nslogstr)()=^()

;//通過**變數呼叫**塊

nslogstr();

在預設狀態,當用塊訪問區域性變數的值時候,是不允許修改區域性變數的。

但當為區域性變數加上__block修飾就可以修改區域性變數

__block int a=10;

void (^nslogstr)()=^()

;//通過**變數呼叫**塊

nslogstr();

2016-05-01 16:20:23.860 [2470:103092] 10

2016-05-01 16:20:23.861 [2470:103092] 20

2016-05-01 16:20:23.861 [2470:103092] hello block

看下面**int a=10;

void (^nslogstr)()=^()

;a=30;

//通過**變數呼叫**塊

nslogstr();

nslog(@"%d",a);

猜猜應該列印的值是多少?兩個a都是30?

2016-05-01 16:27:57.600 [2543:107259] 10

2016-05-01 16:27:57.601 [2543:107259] hello block

2016-05-01 16:27:57.601 [2543:107259] 30

why?

原來,在定義**塊時就已經把區域性變數的值複製到塊 。所以即使在定義後、呼叫前修改區域性變數,依然是沒有用的。 倘若我們我們想等到執行時才去訪問獲取甚至去修改區域性變數的值,我們可以在區域性變數前面加__block

這時候我們需要引入乙個typedef用typedef可以定義**塊型別,主要有兩個作用

復用塊變數型別,使用塊變數型別可以重複定義多個塊變數

使用塊變數型別定義函式引數,這樣可定義帶塊引數的函式

typedef 塊返回值型別(^塊變數型別)(形參型別1,形參型別2,....);定義乙個函式,block作為函式最後乙個引數

typedef nsstring* (^logstr)(nsstring *);

void nslogstr(nsstring *name,logstr log)

呼叫: nsstring *name=@"賈伯斯";

nslogstr(name, ^nsstring *(nsstring *name) );

Block用法解析

block 塊是對c做出的乙個補充,初次體驗 塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給 帶來層次上的提公升。block就是一段在將來被執行的 塊返回值型別 形參型別1 形參1,形參型別2 形參2,塊返回值型別 塊變數名 形參型別1,形參型別2,定義...

block用法小計

預設情況下,任何block都是在棧中,隨時可能會被 對block設定copy屬性,block的記憶體就會放到堆裡面。book b book alloc init b.block 如果像上述寫法block所指向的 塊會強引用book的記憶體位址,使得book物件不能釋放,造成記憶體洩露。book b ...

block 基本用法

專門處理 需要重複呼叫的 block 返回值相同,引數相同 在.h檔案中,宣告 typedef void typedefblock nsstring typedef int typedefbock2 inta,intb ibaction testaction id sender oc語言 self ...