block的基本使用

191 阅读1分钟

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);