block介绍
-
快速敲出Block语法快捷方式:inlineBlock
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) { <#statements#> }; -
block声明,定义
void(^block)() = ^(void) { // 保存什么样的代码 NSLog(@"执行block"); }; -
block作用:帮你保存一份代码,等到恰当时机的时候才去调用
-
block调用:恰当的时机去执行block
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 执行block _p.operation(); }
block 三种使用场景
1、把block保存到对象中,恰当时机的时候才去调用
@interface Person : NSObject
// block类型:void(^)()
@property (nonatomic, copy) void(^operation)();
@end
Person *p = [[Person alloc] init];
void(^block)() = ^() {
NSLog(@"执行对象中block");
};
// p.operation = ^(){
//
// NSLog(@"执行对象中block");
// };
p.operation = block;
_p = p;
2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.
// name:类型的别名
typedef void(^BlockName)();
@interface Person : NSObject
- (void)eat:(BlockName)block;
// 参数类型:block类型
// - (void)eat:(void(^)())block;
@end
@implementation Person
- (void)eat:(void (^)())block
{
block();
}
@end
Person *p = [[Person alloc] init];
void(^block)() = ^{
NSLog(@"吃东西");
};
[p eat:block];
// 传入block给参数的Block赋值
[p eat:^{
NSLog(@"吃东西");
}];
3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用
@interface Person : NSObject
- (void)run:(int)metre;
- (void(^)(int))run;
@end
@implementation Person
- (void)run:(int)metre
{
NSLog(@"跑了%d米",metre);
}
- (void (^)(int))run
{
return ^(int meter){
NSLog(@"跑了%d米",meter);
};
}
@end
Person *p = [[Person alloc] init];
// 如果想换成点语法
// 点语法是get方法,需要换成get方法,把block当做方法的返回值
// [p run:2];
p.run(2);