基本的な使い方
返り値無し・引数無しのblocks
void (^blocksName)() = ^{ NSLog(@"blocks"); }; blocksName(); // "blocks"と出力される
返り値無し・引数有りのblocks
void(^blocksName)(NSString *) = ^(NSString *string) { NSLog(@"%@", string); }; blocksName(@"blocks!!!!!"); // 引数の内容が出力される
返り値有り・引数有りのblocks
NSString *(^blocksName)(NSString *) = ^NSString *(NSString *string) { NSLog(@"%@", string); return [string uppercaseString]; }; NSString *ret = blocksName(@"blocks"); // 引数の内容が出力される NSLog(@"%@", ret); // BLOCKS と出力される
引数複数もいける
void(^blocksName)(NSString *, NSString *) = ^(NSString *string1, NSString *string2) { NSLog(@"%@, %@", string1, string2); }; blocksName(@"foo", @"bar");
引数・返り値は当然NSString以外も使えます
関数の引数として使う
blocksの型を宣言して使う
typedef void(^BlocksType)(); // 引数・返り値なしのblocksをBlocksTypeという型名でdefine - (void)foo:(BlocksType)blocks { blocks(); } - (void)bar { // fooメソッドの中でblocksが実行されて、"blocks"と出力される [self foo:^{ NSLog(@"blocks"); }]; }
少し分かりにくくなるから、publicなメソッドでは使いたくないけど、blocksをそのまま渡すことも出来る。
- (void)foo:(void (^)())blocksName { blocksName(); } - (void)bar { // fooメソッドの中でblocksが実行されて、"blocks"と出力される [self foo:^{ NSLog(@"blocks"); }]; }