[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