美文网首页
IOS_Block_定义

IOS_Block_定义

作者: 大美象 | 来源:发表于2017-02-16 11:31 被阅读44次

    [TOC]

    Declare

    c语言中方法修饰符 ( ) ,如定义一个方法:

    int f();
    

    block指针修饰符^
    block指针修饰符只能被应用于方法(你不可以写int ^a;这是没有被定义的)
    这正是为什么int ^b( )是非法的,并且会造成编译器错误:如果你使用优先级规则来读这个声明,b将会是一个方法,这个方法返回一个指向int类型的block指针。你也知道,并没有这回事儿。所以当你声明一个block时,你总是需要将标识符和修饰符放在圆括号中了

    int (^b)();
    

    b是一个block指针,这个指针指向返回int类型的方法。
    当然你也可以指定block所需要的参数:

    int (^b)(long);
    
    定义一个本地变量
    returnType ( ^blockName)(parameterTypes) = ^returnType(parameters){};
    例如:
    int (^b) (int) = ^int(10){
      ... do some thing
    };
    
    定义一个property
    @prpperty (nonatomic, copy, nullability) returnType (^blockName)(parameterTypes);
    例如:
    @prpperty (nonatomic, copy, nullability) int (^b)(double);
    
    作为参数或者返回值

    在Objective-C方法中使用blocks作为参数或者返回值,我们需要寻找为那些blocks定义的抽象声明符。我们可以通过移去标识符。

    int (^b)( )变成int (^)( ),  int (^b)(long)变成 int (^)(long).
    - (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;
    例如:
    - (void) methodWithArgument: (int(^)( )) block;
    - (void) anotherMethodWithArgument: (void(^)(long arg1)) block;
    

    这些抽象声明中你不需要为你的block参数取名

    作为 typedef:
    typedef returnType (^TypeName)(parameterTypes);
    TypeName blockName = ^returnType(parameters) {...};
    例如:
    typedef void(^failBlock)(NSError *error);
    typedef void(^convertToMp4Completed)(void);
    
     
    
    方法调用:
    [someObject someMethodThatTakesABlock:^returnType (parameters) {...}];
    

    refrence from
    fuckingblocksyntax.com
    objective-c-blocks-syntax
    block_usage

    相关文章

      网友评论

          本文标题:IOS_Block_定义

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