• Objective-C基础笔记(6)Block


    Block(代码段)封装了一段代码,可以在任何时候执行。

    Block可以作为函数参数或者函数返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下它对局部变量是只读的。

    苹果官方建议尽量多用block.在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。

    Block的定义:

    int (^MySum) (int, int) = ^(int a, int b){

    return a + b;

    }

    定义了一个叫MySum的block对象,它带有两个int参数,返回int类型,等号右边是block的具体实现。

    void test(){
        //定义了一个block,这个block返回值是int类型,接收两个int类型参数
        int (^Sum) (int, int) = ^(int a, int b){
            return a + b;
        };
        
        int a = Sum(10, 11);
        
        NSLog(@"%i", a);
    }
    void test2(){
        //block可以访问局部变量,但默认情况下不能修改
        int c = 15;
        //使用__block关键字,变量可以在block中修改
        __block int b = 25;
        
        MySum sum = ^(int a, int b){
            NSLog(@"C is %i", c);
            b = 35;
            NSLog(@"B is %i", b);
            return a + b;
        };
        
        NSLog(@"%i", sum(10, 10));
    }
    在上一篇中我们实现了一个按钮监听器,这一篇我们使用block来实现按钮监听器。

    #import <Foundation/Foundation.h>
    @class Button;
    
    typedef void (^ButtonBlock) (Button *);
    
    @interface Button : NSObject
    
    //这里暂时用assign
    @property (nonatomic, assign) ButtonBlock block;
    
    //模拟按钮点击
    - (void)click;
    
    @end
    在Button.h中我们定义了一个数据类型  void(^ButtonBlock) (Button *), 然后定义一个该类型的成员变量 ButtonBlock block;

    添加了一个成员方法 - (void)click;

    #import "Button.h"
    
    @implementation Button
    
    - (void)click {
        _block(self);
    }
    
    @end
    
    Button.m文件中实现了 - (void)click方法
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Button *btn = [[[Button alloc] init] autorelease];
            
            btn.block = ^(Button *btn){
                NSLog(@"按钮%@被点击了", btn);
            };
            //模拟按钮点击
            [btn click];
        }
        return 0;
    }
    最后在主函数中我们先获取按钮对象,然后给按钮对象中的block对象赋值,最后在模拟按钮点击事件的触发。

    细心的朋友可能会发现,这里定义的block和c语言中的指向函数的指针特别想,两个对比如下:

    int sum1(int a, int b){
        return a + b;
    }
    
    void test3(){
        
        //Block
        int(^sum)(int, int) = ^(int a, int b){
            return a + b;
        };
        
        //指向函数的指针
        int (*sum1)(int, int) = sum1;
        
        //调用
        sum(11, 11);
        sum1(10, 10);
    }
    typedef int(^MySum) (int, int);
    typedef int (*sum2)(int, int);

  • 相关阅读:
    1.1. 哪一种 Python 适合您?
    使用自定义的 grafana插件
    ubuntu更换pip源
    安装gitlfs
    密钥配置
    java学习ArrayList集合讲解
    java学习Scanner常用类学习
    java学习猜数字游戏
    java学习匿名对象
    java学习一个标准类
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468715.html
Copyright © 2020-2023  润新知