美文网首页糖糖的iOS专题
Block的三种应用场景

Block的三种应用场景

作者: 我的梦想之路 | 来源:发表于2016-07-14 23:38 被阅读48次

    block开发中使用场景
    1.把block保存到对象中,恰当的时候才去调用
    2.把block当做方法的参数使用,外界不调用,都是方法内部调用
    3.把block当做方法的返回值,目的是为了代替方法.(封装内部的实现,把block当做一个方法的返回值)

    1.把block保存到对象中,恰当的时候才去调用

    /// block简单的定义
    - (void)block{
        // block 的定义,声明
        void(^block)() = ^() {
            // 保存什么样的代码
            NSLog(@"执行block");
        };
        
        // block的作用:帮你保存一份代码,等你恰当的时候才去调用
        
        
        // 调用block
        block();
    
    }
    
    #Person.h类
    @interface Person : NSObject
    
    // block类型:void(^)()
    // block:作为属性的时候其修饰符一定是copy
    #对上面的解释,详细的内存管理,以及处理见大神的博客:http://www.jianshu.com/p/ac86dc80cca5
    @property (nonatomic,strong)void(^operation)();
    
    // 参数类型:block类型
    - (void)eat:(void(^)())block;
    
    // 返回类型:block类型
    - (void(^)(NSInteger))run;
    //- (void)run:(NSInteger)meter;
    
    @end
    
    #Person.m
    #import "Person.h"
    
    @implementation Person
    
    - (void)eat:(void (^)())block{
        block();
    }
    
    
    
    - (void (^)(NSInteger))run{
        return ^(NSInteger meter){
            NSLog(@"跑了%ld米",meter);
        };
    }
    @end
    
    #1.把block保存到对象中,恰当的时候才去调用
    /// 保存到对象中
    - (void)block1{
        
        // 第一种方式直接给一个block块
        //    _p.operation = ^(){
        //        NSLog(@"执行Person中的block");
        //    };
        
        // 第二种:采用赋值思想
        void(^block)() = ^() {
            NSLog(@"执行Person中的block");
        };
        _p.operation = block;
    }
    
    /// 点击屏幕时调用block
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        _p.operation();
    }
    

    2.把block当做方法的参数使用,外界不调用,都是方法内部调用

    /// 把block当做方法的参数使用,外界不调用,都是方法内部调用
    - (void)block2{
        [_p eat:^{
            NSLog(@"执行Person中的吃的方法");
        }];
    }
    

    3.把block当做方法的返回值,目的是为了代替方法.(封装内部的实现,把block当做一个方法的返回值)

    #import "ViewController.h"
    
    #import "Person.h"
    
    @interface ViewController (){
        Person *_p;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        /**
         block开发中使用场景
         1.把block保存到对象中,恰当的时候才去调用
         2.把block当做方法的参数使用,外界不调用,都是方法内部调用
         3.把block当做方法的返回值,目的是为了代替方法.(封装内部的实现,把block当做一个方法的返回值)
         */
        _p = [[Person alloc] init];
        
    //    [_p run:2]; 平常调用方法
        _p.run(2); // 利用block当做方法的返回值
        
    }
    

    相关文章

      网友评论

        本文标题:Block的三种应用场景

        本文链接:https://www.haomeiwen.com/subject/ttcyjttx.html