美文网首页
10.Objective-C之Block

10.Objective-C之Block

作者: 峰子1994 | 来源:发表于2017-10-28 17:38 被阅读7次

    前言:

    本小节知识点:
    1.【了解】什么是Block
    2.【理解】block的格式
    

    1.Block的概念:

    Block是iOS中一种比较特殊的数据类型
    Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛
    动画
    多线程
    集合遍历
    网络请求回调
    Block的作用
    用来保存某一段代码, 可以在恰当的时间再取出来调用
    功能类似于函数和方法
    

    2.Block的格式:

    Block的定义格式
    返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
    
    };
    
    image.png
    block最简单形式
    void (^block名)() = ^{代码块;}
    
    例如:
    void (^myBlock)() = ^{ NSLog(@"李南江"); };
    block带有参数的block的定义和赋值
    void (^block名称)(参数列表)
    = ^ (参数列表) { // 代码实现; }
    
    例如:
    void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
    带有参数和返回值的block
    返回类型 (^block名称)(参数列表)
    = ^ (参数列表) { // 代码实现; }
    
    例如:
    int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
    调用Block保存的代码
    block变量名(实参);
    

    3.block和typedef的使用:

    由于相同的部分可以抽离出来,所以需要使用typedef:
    OC的block的用法
    #import <Foundation/Foundation.h>
    int main(int argc,onst char * argv[])
    {
        int (^sumBlock)(int,int);
        sumBlock = ^(int value1,int value2){
            return value1 + value2;
        };
        NSLog(@"sum = %i",sumBlock(20,10));
        
        int (^minBlock)(int,int);
        minBlock = ^(int value1,int value2){
            return value1 - value2;
        };
        NSLog(@"min = %i",minBlock(20,10));
        
        return 0;
    }
    使用typedef之后:
    #import <Foundation/Foundation.h>
    typedef int (^calculteBlock)(int,int);
    int main(int argc,onst char * argv[])
    {
        calculteBlock sumBlock = ^(int value1,int value2){
            return value1 + value2;
        };
        NSLog(@"sum = %i",sumBlock(20,10));    
        calculteBlock minBlock = ^(int value1,int value2){
            return value1 - value2;
        };
        NSLog(@"min = %i",minBlock(20,10));    
        return 0;
    }
    

    4.block的应用场景:

    在学习UI之后就会体会到block的好处。
    如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。
    加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。
    

    相关文章

      网友评论

          本文标题:10.Objective-C之Block

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