iOS-block开发中使用场景

 

一、最简单的block

1、最简单的block结构

^{
    NSLog(@"this is a block");
    NSLog(@"this is a block");
    NSLog(@"this is a block");
};

 

2、block的调用

^{
    NSLog(@"this is a block");
    NSLog(@"this is a block");
    NSLog(@"this is a block");
}();

 

void (^block)(void) = ^{
    NSLog(@"this is a block");
    NSLog(@"this is a block");
    NSLog(@"this is a block");
};
block();

 

二、block 开发中使用场景

1.定义、赋值、调用

/*
 block要掌握的东西 (定义 赋值 调用)
 1> 如何定义block变量
 int (^sumBlock)(int, int);
 void (^myBlock)();
 
 2> (给block 赋值)如何利用block封装代码
 ^(int a, int b) {
    return a - b;
 };
 
 ^() {
    NSLog(@"----------");
 };
 
 ^ {
    NSLog(@"----------");
 };
 
 3> block访问外面变量
 * block内部可以访问外面的变量
 * 默认情况下,block内部不能修改外面的局部变量
 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
 
 * block访问全局变量时直接访问不会引用
 
 4> 利用typedef定义block类型
 typedef int (^MyBlock)(int, int);
 // 以后就可以利用MyBlock这种类型来定义block变量
 MyBlock block;
 MyBlock b1, b2;
 
 b1 = ^(int a, int b) {
    return a - b;
 };
 
 MyBlock b3 = ^(int a, int b) {
    return a - b;
 };
 */

 

1.开发中的应用

 block开发中使用场景 

  1. 把block保存到对象中,恰当时机的时候才去调用 
  2. 把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定. 
  3. 把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用

 

ViewController.m 中用到了Person类

ViewController.m

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@property (nonatomic, strong) Person *p;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // block开发中使用场景
    
    // 1.把block保存到对象中,恰当时机的时候才去调用
    
    // 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.
    
    // 3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用
    
}

// block作用:帮你保存一份代码,等到恰当时机的时候才去调用
- (void)block
{
    // block声明,定义
    //快捷键 inlineBlock
    //    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
    //        <#statements#>
    //    };
    void(^block)() = ^() {
        // 保存什么样的代码
        
        NSLog(@"执行block");
        
    };
    
    // 调用block
    block();
    
}

//1.把block保存到对象中,恰当时机的时候才去调用
- (void)block1
{
    Person *p = [[Person alloc] init];
    
    //第一种1.赋值
    void(^block)() = ^() {
        NSLog(@"执行对象中block");
    };
    p.operation = block;

    //第一种2.赋值
    p.operation = ^(){
        
        NSLog(@"执行对象中block");
    };
    
    _p = p;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //调用 1
    _p.operation();
}



// 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给 外界决定.
- (void)block2
{
    Person *p = [[Person alloc] init];
    
    //第一种1.传参
    void(^block)() = ^{
        NSLog(@"吃东西");
    };
    [p eat:block];
    
    //第一种2.传参值
    // 传入block给参数的Block赋值
    [p eat:^{
        NSLog(@"吃东西");
    }];
}


//3.把block当做方法的返回值,目的就是为了代替方法.,block交给 内部实现 ,外界不需要知道Block怎么实现,只管调用
- (void)block3
{
    //目的就是为了代替方法 功能一样 写法不一样
    Person *p = [[Person alloc] init];
    //方法run
    [p run:2];
    
    
    //block作为返回值 为什么能够用点调用呢p.run 进去看解释
    p.run(2);  //p.run返回值是block 相当于 block, block()语法是通的 所以 p.run(2)语法是对的相当于给block传一个参数int2
    
    //代码解释上面的现象
    void(^run)() = p.run; //p.run返回值是block 用block接受
    run(2); //调用block
    
}




@end

 

定义一个 Person.h

#import <Foundation/Foundation.h>

// name:类型的别名
typedef void(^BlockName)();
typedef void(^operation)();

@interface Person : NSObject

// block:ARC使用strong,非ARC使用copy
// block类型:void(^)()

//1.把block保存到对象中,恰当时机的时候才去调用
@property (nonatomic, strong) void(^operation)();
//@property (nonatomic,strong) operation operation;


// 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.
// 参数类型:block类型
- (void)eat:(void(^)())block;
//- (void)eat:(BlockName)block;



//3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用
//功能一样写法不一样
//方法这样写
- (void)run:(int)metre;
//把block当做方法的返回值
- (void(^)(int))run;


@end

Person.m

#import "Person.h"

@implementation Person

/**
 *   2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.
 *  @param block 代码块传过来
 */
- (void)eat:(void (^)())block
{
    /**
    block = ^{
        NSLog(@"吃东西");
    };
     */

    //调用
    block();
    
}


//3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用
//方法
- (void)run:(int)metre
{
    NSLog(@"%d",metre);
}

//把block当做方法的返回值 相当于一个get方法 (点语法是一个编译器的特性 如果给属性提供了getter和setter方法, 那么就可以通过点语法来访问属性)
- (void (^)(int))run
{
    return ^(int meter){
      
        NSLog(@"跑了%d米",meter);
    };
}
@end

 

 

 

posted @ 2021-06-29 17:02  俊华的博客  阅读(124)  评论(0编辑  收藏  举报