[OC] Block 是什么
Block 是 帶有自動變量的匿名函數。
emmmm 反正我看了也不懂,我們一點點用具體的例子分析一下block。
1. 我們現在要在一個文件中使用block(我們后面再提到兩個界面傳值的block的例子??)
void (^ourblo)(void);
這樣就聲明了一個叫做 ourblo 的 block,但是他是空的。
符號 " ^ " 代表block,這個block的名字叫做 " ourblo "。(里面的幾個void我們后面再說)
我們有以下這個例子:
void (^ourblo)(void) = ^(void){ NSLog(@"呵呵"); }; ourblo();
在這里我們給他賦了一個值(即 等號后面的內容)。
我們可以把它看作一個函數,這個函數的內容就是打印“呵呵”兩個字。
在聲明了這個block之后,我們直接用 ourblo() 的方式就可以使用它。
2.現在我們需要使用一個,可以傳值進去的block,我們把上面的代碼稍微改一下,就可以得到下面這個:
void (^ourblo)(NSString *str) = ^(NSString *str){ NSLog(@"%@", str); }; NSString *myStr = @"呵呵呵"; ourblo(myStr);
注意看,我們把第一個例子里的 兩個 void 都替換成了 NSString *str,這就是我們要傳給這個函數的輸入值。
這個時候,ourblo的功能就變成了,打印出我們傳給它的字符串。
3.繼續,我們現在需要一個block幫我們判斷,我們傳入的字符串是不是“呵呵”:
BOOL (^ourblo)(NSString *str) = ^(NSString *str){ if ([str isEqualToString:@"呵呵"]) { //字符串是“呵呵” return YES; } else { return NO; } }; NSString *myStr = @"呵呵"; BOOL isHeHe = ourblo(myStr);
我們把剩余的最后一個 void 改成 BOOL ,這就是我們想得到的這個函數輸出的值的類型。
這個例子里,函數就滿足了我們上面說的這個功能。是“呵呵”的時候他會返回 YES,不是的時候會返回 NO。
4.在上面的例子里,我們把block當作函數去理解。不過 block 是可以被賦值的,比如下面這樣:
BOOL (^ourblo)(NSString *str);//這句代碼 初始化 ourblo ourblo = ^(NSString *str) { if ([str isEqualToString:@"呵呵"]) { return YES; } else { return NO; } }; NSString *myStr = @"呵呵"; BOOL isHeHe = ourblo(myStr); // 對 ourblo 重新賦值 ourblo = ^(NSString *str) { return NO; }; BOOL isHeHe2 = ourblo(myStr); NSLog(@"%@,%@",@(isHeHe), @(isHeHe2));
我們對 ourblo 進行重新賦值,會看到最后打印出來的結果是 1 , 0
即一個 YES,一個 NO,說明重新賦值之后,再使用 ourblo時,它的邏輯確實被修改了。
5.在另一篇里講了如何通過 block 實現兩個頁面的傳值和交互。
http://www.rzrgm.cn/OranBlog/p/5861826.html
其實,它的原理可以看作,B中定義的“函數”,在 A 中被賦值,然后被B調用。

浙公網安備 33010602011771號