关于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 的简单使用