谈谈Block作为属性、方法参数、方法的返回值的应用
2017-10-25 10:41
190 查看
在IOS开发中block常用于
作为对象的属性、作为方法的参数、作为方法的返回值。
首先需要了解一下block的标准书写格式:
returnType(^blockName)(parameterTypes) = ^returnType(parameters)
{
statements
};
下面我们结合代码对几种情况作介绍。
一、block作为对象的属性。
我们在工程中常见一个Person类,它是继承与NSObject。
给Person类添加一个block属性。即:
@property(nonatomic,strong)
void(^block)();
接着在viewDidLoad中书写一个方法
- (void)propertyTest{
Person * p = [[Person
alloc]init];
void(^AMFBlock)() = ^() {
NSLog(@"enter block");
};
p.block =
AMFBlock;
_p = p;
}
接着在点击touchesBegan方法调用p对象的block属性时,就会回调到propertyTest方法中的block代码块:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event {
_p.block();
//回调到propertyTest方法中的block代码块去
}
二、block作为方法的参数。
给Person类添加一个有block参数的方法。即:
.h文件
- (void)eat:(void(^)(NSString *))block;
.m文件
- (void)eat:(void (^)(NSString *))block{
block(@"苹果");
}
给viewController添加一个methodParameter方法,且在viewDidLoad中调用该方法[self
methodParameter];:
- (void)methodParameter{
Person * p = [[Person
alloc]init];
[p eat:^(NSString * s) {
NSLog(@"爱吃%@",s);
}];
}
那么当执行上面写的 block(@"苹果");时候,接着就会自动回调到methodParameter中的
block 代码块。
三、block作为方法的返回值。
给Person类添加一个返回一个block类型的方法。即:
.h文件
-(void(^)(int))run;
.m文件
-(void (^)(int))run
{
return ^(int m){
NSLog(@"跑起来了!!跑了%d",m);
};
}
在viewController的viewDidLoad方法中实现以下代码,当调用receiveBlock(100)时,会自动回调到NSLog(@"跑起来了!!跑了%d",m)代码块中:
Person * p = [[Person
alloc]init];
void(^receiveBlock)(int i) = p.run; //方法的返回值返回了一个block
receiveBlock(100); //输出结果跑起来了!!跑了%d",m)代码块中
我们经常用到的布局框架masonry很多地方用到了block作为方法的返回值思想。
作为对象的属性、作为方法的参数、作为方法的返回值。
首先需要了解一下block的标准书写格式:
returnType(^blockName)(parameterTypes) = ^returnType(parameters)
{
statements
};
下面我们结合代码对几种情况作介绍。
一、block作为对象的属性。
我们在工程中常见一个Person类,它是继承与NSObject。
给Person类添加一个block属性。即:
@property(nonatomic,strong)
void(^block)();
接着在viewDidLoad中书写一个方法
- (void)propertyTest{
Person * p = [[Person
alloc]init];
void(^AMFBlock)() = ^() {
NSLog(@"enter block");
};
p.block =
AMFBlock;
_p = p;
}
接着在点击touchesBegan方法调用p对象的block属性时,就会回调到propertyTest方法中的block代码块:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event {
_p.block();
//回调到propertyTest方法中的block代码块去
}
二、block作为方法的参数。
给Person类添加一个有block参数的方法。即:
.h文件
- (void)eat:(void(^)(NSString *))block;
.m文件
- (void)eat:(void (^)(NSString *))block{
block(@"苹果");
}
给viewController添加一个methodParameter方法,且在viewDidLoad中调用该方法[self
methodParameter];:
- (void)methodParameter{
Person * p = [[Person
alloc]init];
[p eat:^(NSString * s) {
NSLog(@"爱吃%@",s);
}];
}
那么当执行上面写的 block(@"苹果");时候,接着就会自动回调到methodParameter中的
block 代码块。
三、block作为方法的返回值。
给Person类添加一个返回一个block类型的方法。即:
.h文件
-(void(^)(int))run;
.m文件
-(void (^)(int))run
{
return ^(int m){
NSLog(@"跑起来了!!跑了%d",m);
};
}
在viewController的viewDidLoad方法中实现以下代码,当调用receiveBlock(100)时,会自动回调到NSLog(@"跑起来了!!跑了%d",m)代码块中:
Person * p = [[Person
alloc]init];
void(^receiveBlock)(int i) = p.run; //方法的返回值返回了一个block
receiveBlock(100); //输出结果跑起来了!!跑了%d",m)代码块中
我们经常用到的布局框架masonry很多地方用到了block作为方法的返回值思想。
相关文章推荐
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
- block作为属性,作为参数,作为返回值各种情况演示
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Objective-c - block作为方法的参数
- DA的存储过程 服务器端返回参数的应用方法
- 方法作为参数,委托应用
- 写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回
- delphi中类的属性不能作为可变参数传递给方法
- block作为属性,作为参数,作为返回值各种情况演示
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- block作为属性,作为参数,作为返回值各种情况演示
- Java - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Objective-c - block作为方法的参数:字符串数组的排序
- mybatis从dao传入多个参数到sqlmap时dao中要使用map或实例对象(如:user)作为参数传入, 否则报错找不到属性getter方法
- block作为属性,作为参数,作为返回值各种情况演示
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- DA的存储过程 服务器端返回参数的应用方法