您的当前位置:首页正文

IOS_Block_定义

来源:要发发知识网

[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) {...}];