サーチ…
構文
変数として:
returnType(^ blockName)(parameterTypes)= ^ returnType(parameters){...};
プロパティとして:
@property(非構造、コピー)returnType(^ blockName)(parameterTypes);
メソッドのパラメータとして:
- (void)methodWithBlock:(returnType(^)(parameterTypes))ブロック名。
typedefとして:
typedef returnType(^タイプ名)(parameterTypes);
タイプ名blockName = ^ returnType(parameters){...};
UIViewアニメーション
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
カラット「^」文字はブロックを定義します。たとえば、 ^{ … }
はブロックです。具体的には、 "void"を返し、引数を受け付けないブロックです。これは、 " - (void)something;"のようなメソッドに相当しますが、コードブロックに関連付けられた固有の名前はありません。
引数を受け入れることができるブロックを定義することは、非常によく似ています。引数をブロックに与えるには、^(BOOL someArg、NSString someStr){...} *のようにブロックを定義します。ブロックをサポートするAPI呼び出しを使用する場合は、上記の例に示すように、特にアニメーションブロックまたはNSURLConnectionブロックの場合と同様のブロックを作成します。
カスタムメソッドのカスタム補完ブロック
1-独自のカスタムブロックを定義する
typedef void(^myCustomCompletion)(BOOL);
2カスタム補完ブロックをパラメータとするカスタムメソッドを作成します。
-(void) customMethodName:(myCustomCompletion) compblock{
//do stuff
// check if completion block exist; if we do not check it will throw an exception
if(complblock)
compblock(YES);
}
3-メソッドのブロックの使い方
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
キャプチャされた変数の変更
ブロックは、同じレキシカルスコープに現れた変数をキャプチャします。通常、これらの変数は "const"値として取り込まれます。
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
変数を変更するには、__blockストレージタイプ修飾子を使用する必要があります。
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};