zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
    Ubuntu16.04进入挂起或休眠状态时按任何键都无法唤醒问题解决办法
    Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
    A start job is running for Raise network interface(5min 13s )问题解决方法
    Ubuntu16.04 “有线未托管”有线网络不可用问题解决
    A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法
    Linux 串口终端调试工具minicom
    Linux 终端仿真程序Putty
    Oracle:在 debian9 上完美安装 oracle 10.2.0.5 x64
    从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!
  • 原文地址:https://www.cnblogs.com/junhuawang/p/14680853.html
Copyright © 2011-2022 走看看