[TOC]
Declare
c語言中方法修飾符 ( ) 践险,如定義一個方法:
int f();
block指針修飾符^
block指針修飾符只能被應(yīng)用于方法(你不可以寫int ^a;這是沒有被定義的)
這正是為什么int ^b( )是非法的,并且會造成編譯器錯誤:如果你使用優(yōu)先級規(guī)則來讀這個聲明,b將會是一個方法克滴,這個方法返回一個指向int類型的block指針。你也知道允坚,并沒有這回事兒漫试。所以當(dāng)你聲明一個block時,你總是需要將標(biāo)識符和修飾符放在圓括號中了
诡右。
int (^b)();
b是一個block指針安岂,這個指針指向返回int類型的方法。
當(dāng)然你也可以指定block所需要的參數(shù):
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);
作為參數(shù)或者返回值
在Objective-C方法中使用blocks作為參數(shù)或者返回值帆吻,我們需要尋找為那些blocks定義的抽象聲明符嗜闻。我們可以通過移去標(biāo)識符。
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參數(shù)取名
作為 typedef:
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {...};
例如:
typedef void(^failBlock)(NSError *error);
typedef void(^convertToMp4Completed)(void);
方法調(diào)用:
[someObject someMethodThatTakesABlock:^returnType (parameters) {...}];
refrence from
fuckingblocksyntax.com
objective-c-blocks-syntax
block_usage