關於Block,博主不才,簡單分為三種來用: 像函數一樣定義和使用,,不同於函數的是可以定義在方法內也可以定義在方法外 定義成property的屬性來使用 用作修飾詞
接下來一樣樣的來展示;
1.像函數一樣定義和使用,,不同於函數的是可以定義在方法內也可以定義在方法外
1)在方法中使用
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *(^thisBlock) (NSString *thisName) = ^(NSString *name){ return [NSString stringWithFormat:@"%@:%@",@"name",name]; }; NSLog(@"%@",thisBlock(@"xiaoming"));}
2)在方法外使用,就像定義一個方法一樣
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. BlockVoid(24);}void (^BlockVoid) (int age) = ^(int xiaomingAge){ NSLog(@"xiaomingAge:%d",xiaomingAge);};
總結: 上面倆block也是block的一種寫法不過這麼用的貌似不多見,大多時候這麼寫反而顯得麻煩了(從這裡可以看出,block可以定義在方法內部也可以定義在方法外部,在外部的時候看著是不是更像函數了)
2.定義成property的屬性來使用
這是一種我們經常用的方法,舉個例子
/** 常規無傳回值有參數block,比較常用 */@property(nonatomic,copy)void (^myBlock) (NSString *name,int age);/** 常規有傳回值有參數block,使用起來其實和上面那個差別不大 */@property(nonatomic,copy)NSString *(^haveReturnBlock) (NSString *name);//用法- (void)test2{ _myBlock(@"CodeLiu",24);}- (NSString *)test3{ return _haveReturnBlock(@"小花");}
除了這個用法,還有一種很好玩的用法,看著比較生動,其實是一樣的:
#import <Foundation/Foundation.h>/** 定義一個block @param returnContent 傳回值 */typedef void(^RetureContentBlock)(id returnContent);@interface LHBlockForUse : NSObject/** 用定義的block來聲明一個變數 */@property(nonatomic,copy)RetureContentBlock returnBlock;@end//用法- (void)test1{ _returnBlock(@"You can put every type in here");}
3.用作修飾詞
在Block內是不能修改Block外的變數的,如果要修改就需要用__block進行修飾
__block int lastAge = 24; void (^lastAgeBlock) (int age) = ^(int addAge){ lastAge = lastAge + addAge; NSLog(@"xiaomingLastAge:%d",lastAge); };lastAgeBlock(1);
以上是Block的簡單應用,如果哪裡寫的不好歡迎指正,下載地址:Block 的簡單使用