2013年7月19日金曜日

Block構文の基本

今回はBlock構文(Block Literal Syntax)についてです。最近はデリゲートよりBlockが推奨されてきているので調べてメモしようと思います。

Blockの基本構文

Blockの基本的な使い方をまとめていきます。

宣言、代入、実行

// 宣言
void (^blocksTest1)(void);

// 代入
blocksTest1 = ^(void) {
    NSLog(@"blocksTest1");
};

// 実行
blocksTest1();

宣言は、戻り値(^関数名)(引数) と宣言します。引数voidは()に省略可能です。
代入は、関数名の後ろにイコール(=)を入れ、^(引数){} のように行います。
実行は、関数名() のようにして呼びます。

宣言、代入を同時に行う

// 宣言, 代入
void (^blocksTest2)(void)  = ^(void) {
    NSLog(@"blocksTest2");
};

// 実行
blocksTest2();
宣言、代入を同時に行った例です。

すぐに実行

^() {
    NSLog(@"テスト");
}();
Block構文を定義して、すぐに実行する例です。

返り値あり、引数なし

int (^blocksTest3)(void) = ^(void) {
     return 10;
};

// 実行、NSLog()でログ出力
NSLog(@"%d", blocksTest3());
int型の値を返す関数の記述例です。

返り値あり、引数あり

int (^blocksTest4)(int)=^(int x){
    return x * x;
};

// 実行、NSLog()でログ出力
NSLog(@"%d", blocksTest4(10));
int型の引数をとり、int型の値を返す関数の記述例です。

引数が複数の場合

void (^blocksTest5)(int x, int y) = ^(int x, int y) {
    NSLog(@"%d", x + y);
};

// 実行
blocksTest5(10, 10);
int型の引数2つ、返り値なしの関数の記述例です。
実行時に引数を指定しています。

型を作成する

typedef int (^blocksTest6) (int, int);  // 型作成
    
blocksTest6 bt6 = ^(int num1, int num2){
    return num1 * num2;
};

// 実行、NSLog()でログ出力
NSLog(@"%d", bt6(10, 10));
既存の型に新しい名前を付けることができる「typedef」を使った例。
新しい型"blocksTest6"を作成し、そこに関数を代入しています。

メソッドの引数をBlocksで取得する

// blocksTest7メソッド定義
-(int)blocksTest7:(int(^) (int a, int b))bt7 x:(int)x y:(int)y { 
    return bt7(x, y);
}

-(void)method
{
     // blocksTest7メソッドを呼んでます
    int i = [self blocksTest7:^int(int a, int b){
        return a * b;
    } x:10 y:10];
    
    NSLog(@"%d", i);
}

// どこかで呼ぶ
[self method];
blocksTest7メソッドの、"(int(^) (int a, int b))bt7 x:(int)x y:(int)y" の部分が分かりにくいと思います。これは、引数にint型を2つ、返り値にint型の値を返すbt7関数を引数として指定しています。中ではそのままbt7関数を返しています。

methodメソッドでblocksTest7メソッドを呼んでいます。

スコープ

Blockのスコープ(有効範囲)はBlock構文が定義されている中だけです。Block構文外の変数の値は変更することができません。
ですが「__block」を付ければBlock構文外の変数でも値の変更が可能になります。
//  "__block"をつけて変数外でも値を変更可能にする
__block int x = 100;

void (^blocksTest8)(void) = ^(void) {
    x++;
    NSLog(@"%d", x);
};

blocksTest8();

参考記事

Objective-Cの基礎(Blocks)- @eiKatou Blog
ブロック構文の基本的な使い方 - 逆引きObjective-C for iPhoneアプリ

関連記事

ブロック プログラミング トピック - アップル
Block構文とは(1) - Blog|Penta creation
Block構文とは(2) - Blog|Penta creation
Objective-CのBlocksの循環参照とその解決策 - 三度の飯とエレクトロン
Objective-CのBlocksの循環参照に関する僕なりのベストプラクティス - 三度の飯とエレクトロン
循環参照とは じゅんかんさんしょう: - IT用語辞典バイナリ

0 件のコメント:

コメントを投稿