iOS 块

作者: Mariko00o | 来源:发表于2020-04-04 17:13 被阅读0次

    1.块就是一个实现的闭包(closure),一个允许访问其常规范围之外的变量的函数。

    2.一个Objective-C块实际上就是一个对象,它是NSObject类的子类,拥有NSObject类的所有相关属性(如向块发送消息)。

    块的语法

    1. 声明块类型的语法

    块类型由返回值类型和参数类型列表构成。使用脱字符(^)声明块类型的变量。

    returnType (^blockName) (parameterType,parameterType,...)

    例子:

    int (^oneParamBlock)(int);
    void (^twoParamsBlock)(int,int);//没有返回值
    void (^twoParamsBlock)(int param1,int param2);//与方法声明类似,快变量声明可以含有参数名称
    int (^noParamsBlock)(void);//没有参数
    
    

    2. 块类型

    通过typedef语句,创建类型定义为块类型提供别名,起到简化块类型变量名称的作用。

    typedef returnType(^name)(arguments);

    方法声明中的块变量:

    typedef int(^AdderBlock)(int);
    @interface Atom : NSObject
    -(int)process:(int)count withBlock:(AdderBlock)adder;
    @end
    

    3. 块常量表达式

    使用块常量表达式可以定义对块的引用。

    ^returnType(参数类型 参数名称,...){//块代码}

    该表达式开头的脱字符表名这个表达式是一个块常量表达式。

    例:

    //1.块常量表达式
    ^int (int a){
    return  a + 1;
    };
    //2.没有设置返回值类型的块常量表达式
    ^ (int a){
        return  a + 1;
    };
    //3.不带参数的块常量表达式
    ^ {
        NSLog(@"Hello, World");
    };
    

    可以将块常量赋予块变量:

    int (^myBlock)(int);
    myBlock = ^int (int param){
        return param * param;
    };
    

    可以将块声明和块定义组合到一条语句中:

    int (^myBlock)(int) = ^int (int param){
        return param * param;
    };
    

    4. 调用

    只有调用块时,才会执行其{}体内的代码

    声明了块类型变量并赋予块常量后,就可以直接调用操作符调用该变量。

    int a = myBlock(5);
    NSLog(@"a is %d",a);
    //打印:a is 25
    

    5. __block

    默认情况下,块常量表达式可以访问局部变量,但不能修改局部变量。使用__block修饰局部变量,可以修改局部变。

    __block int myVar = 10;
    void (^intBlock)(int) = ^(int amount){
        myVar += amount;
        NSLog(@"New value = %d",myVar);
    };
    intBlock(5);
    

    当引用变量的块被复制到堆存储区域时,使用__block修改符的变量也会被复制到堆存储区域。

    相关文章

      网友评论

          本文标题:iOS 块

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