Block简单使用
三种使用方式:
1:block作为对象的属性;
2:block作为方法的参数;
3:block作为返回值!!!(扩展非常强!!).
1.block作为对象的属性
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic,strong)Person *p;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.block 作为对象的属性
Person *p = [[Person alloc] init];
//block ---直接输入inlineBlock就可以自动弹出block块
void(^LQBlock)() = ^() {
NSLog(@"block");
};
//调用
p.block = LQBlock;
_p = p;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.p.block();
}
@end
#import <Foundation/Foundation.h>
@interface Person : NSObject
/*block : ARC使用strong,非ARC copy */
@property (nonatomic,strong) void(^block)();
@end
2.block作为方法的参数
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic,strong)Person *p;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self block2];
}
- (void)block2{
//2.block作为方法的参数!!
Person *p = [[Person alloc] init];
[p eat:^(NSString * s){
NSLog(@"爱吃%@",s);
}];
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
/*block : ARC使用strong,非ARC copy */
@property (nonatomic,strong) void(^block)();
//无参数block
//-(void)eat:(void(^)())block;
//有参数block
-(void)eat:(void (^)(NSString *))block;
@end
#import "Person.h"
@implementation Person
//无参数block
//-(void)eat:(void (^)())block{
// block();
//}
//有参数block
-(void)eat:(void (^)(NSString *))block{
block();
}
@end
//3.block作为返回值!!!(扩展非常强!!)
//只要有返回值就能够使用对象来点出对应方法(无带形参)的返回值(即:p.run(12)使用点语法进行点出对应方法的返回值)
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
/** */
@property(strong ,nonatomic)Person * p;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.block作为对象的属性!!
//2.block作为方法的参数!!
//3.block作为返回值!!!(扩展非常强!!)
Person * p = [[Person alloc]init];
p.run(100);
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void(^)(int))run;
@end
#import "Person.h"
@implementation Person
-(void (^)(int))run
{
return ^(int m){
NSLog(@"哥么跑起来了!!跑了%d",m);
};
}
@end
注意事项:
iOS警告-This block declaration is not a prototype
关于警告
我们定义一个不带参数的block,通常是如下的方式
typedefvoid (^UpdateSwichBtnBlock)();
在xcode9中会提示一个警告
This block declaration is not a prototype
Insert ‘void'
解决方式可以是如下的几种
typedefvoid (^UpdateSwichBtnBlock)(void);
但是这样,很多第三方要改,涉及的面太大了,目前可能不太适合,虽然这个是趋势.
或者,如果只是很少的地方,也可以使用
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"
typedefvoid (^UpdateSwichBtnBlock)();
#pragma clang diagnostic pop
彻底的暂时解决所有这种警告的方式
在工程的设置中
11111.png
设置为NO,则这些警告就消失了
不过这不是一种好习惯,只是暂时性的不让提示这种类型的警告而已

