摘自:http://www.cnblogs.com/GarveyCalvin/p/4204167.html>
Date : 2015-12-4
前言:我們可以把Block當作一個閉包函數,它可以訪問外部變量和局部變量,但默認是不可以修改外部變量。你可以使用它來做回調方法,比起使用代理(Delegate)會更加直觀。順帶一提,蘋果很多的接口(API)都使用了Block。
一、Block的基本定義
Block的基本寫法(也是詳細寫法):
returnType (^blockName)(params) = ^returnType(params) { // code... };
中文再解釋:返回類型 (^Block的名字)(Block的參數) = ^返回類型(Block的參數) { 這里放代碼 },例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){ return 100; };
如果你的Block不需要返回類型和參數,那么你可以簡寫為:
void (^myBlock2)() = ^(){ };
或
void (^myBlock2)(void) = ^void(void){ };
返回類型或參數,沒有的話可以用“void”代替。
你也可以把等于號右邊,^后的()刪除,即是:
void (^myBlock2)() = ^{ };
這樣是不是很簡潔?
你也可以先定義一個Block函數,但不寫函數的實現,我們可以在后面再寫具體函數的實現,像這樣:
void (^myBlock2)(void); myBlock2 = ^{ };
二、Block作為方法定義
把Block定義在方法里,與上面不同的是,Block的名字不需要在聲明時寫上,而是在后面,像這樣:
- (void)getWtihBlock:(void (^)())block { // code... // 記得要調用block block(); }
使用方法:
[self getWtihBlock:^{ NSLog(@"sdf"); }];
下面作了一個詳細點的例子,并寫了備注:
/** * 追加自身字符串N次(每次復制前加一個換行\n) * * @param string 字符串 * @param count 追加次數 * @param stringBlock 目標Block,其中str參數為結果字符串 */ // Block也可以定義在方法里,但是不需要定義Block的名字 // IOS開發很多的API也用到了Block,像UIView的塊動畫 - (void)getStrWithString:(NSString *)string CopyCount:(int)count resultString:(void (^)(NSString *str))stringBlock { NSMutableString *newString = [NSMutableString stringWithString:string]; for (NSUInteger i = 0; i < count; i++) { NSUInteger len = [string length]; NSString *insertString = [NSString stringWithFormat:@"\n%@", string]; [newString insertString:insertString atIndex:len]; } // 調用block,傳入字符串newString stringBlock(newString); }
用法也是一樣:
BlockObject *block = [[BlockObject alloc] init]; [block getStrWithString:@"Garvey" CopyCount:3 resultString:^(NSString *str) { // str為處理后的結果 NSLog(@"str is %@", str); }];
有時候復雜的Block語法會令到函數的聲明難以閱讀,所以會經常使用typedef對Block起一個新類型。
typedef void (^ResultBlock)(NSString *str);
定義方法時就變成了:
- (void)getStrWithString2:(NSString *)string CopyCount:(int)count resultString:(ResultBlock)stringBlock;
讓我們對比一下,使用typedef前后:
// 使用前 - (void)getStrWithString:(NSString *)string CopyCount:(int)count resultString:(void (^)(NSString *str))stringBlock; // 使用后 - (void)getStrWithString2:(NSString *)string CopyCount:(int)count resultString:(ResultBlock)stringBlock;
注意:使用方法是一樣的,只不過定義變得簡單了。
如果你一直在使用代理(Delegate)進行方法回調,那么你現在可以嘗試使用Block了。
博文作者:GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/
本文版權歸作者和博客園共有,歡迎轉載,但須保留此段聲明,并給出原文鏈接,謝謝合作!
文章列表