objective-c のブロックについて 初心者向け


このブロック構文でつっかえる人多いんじゃないかとおもいます。公式ドキュメントを読んでもさっぱりわからん。Webを見るとクロージャだのラムダだのと更にわからない言葉が並びます。関連キーワードでそれらを調べれば更にわからなくなっていくかんじでしたが、いくつかのページと書籍のおかげで抜け出すことが出来ました。

ここでは自分なりの理解をまとめてみたいと思います。

ブロックの機能を簡単に言ってしまうとブロックという処理の単位を変数に代入したり、メソッドや関数の引数として直接渡すことができる。そしてその書き方がブロック構文。

ブロックの間の処理が主役

^(引数リスト){};の{と}間で囲まれた部分が処理である。

例はこんな感じ

^(int x,int y){
                return x*y;
                };

こんな感じで書く^ (引数リスト){処理部分}

この処理の塊を実際に使うには変数に代入したり、メソッドの引数に直接渡したりしてつかう。

変数に代入する

ブロック型の変数宣言は 戻り値 (^ブロックの名前)(引数の型のリスト)と書く

例:

int (^bkup)(int,int);

 

関数/メソッドの引数として渡せる

こんなメソッドを作る

-(void)calc:(void (^)(int x,int y))calc{
    int x =10;
    int y =5;
    calc(x,y);
}

このメソッドの呼出は

[self calc:^(int x,int y){
    NSLog(@"%d",x*y);//結果は50
}];

メッセージ送信の際に引数としてブロック(処理の塊)を渡している。
つまり引数のブロックの中身を足し算にも

[self calc:^(int x,int y){
    NSLog(@"%d",x+y);//結果は15
}];

引き算にも変えられる。

[self calc:^(int x,int y){
    NSLog(@"%d",x-y);//結果は5
}];

ここにブロックのメリットがある。メソッドの呼び出し時に処理内容を決めることが出来る。

これから色々試してみたい

デリゲートやら配列の走査やAPIのコールバックとかにつかえるらしい。便利そうだけどまだ試してないのではっきりとはいえない。

重要な部分を書いてない

この記事ではブロックを使う際に重要な変数へのアクセス部分やメモリのことに触れていません。現時点の理解ではここまでしか書けません。これから試していく中でこの辺がわかってきたら触れたいと思います。

なのでこの記事でなんとなくブロックが見えてきたら参考リンクや更に突っ込んだ記事やテストをしてる記事をみたり、テストコードを書いてみるのがイイと思います。あとC言語では関数ポインタというのもあって、さらっと見ておくとブロックの便利さがわかっていいと思います。

参考リンク

この二つが特にわかりやすく感じました。

Objective-Cの基礎(Blocks)@eiKatou Blog

Objective-Cのブロック | YOHEI’s BLOG

参考書籍

実際にガッチリと理解できたのはこちらの本の説明がわかり易かった。

改訂2版 Objective-C逆引きハンドブック 改訂2版 Objective-C逆引きハンドブック
林 晃

シーアンドアール研究所
売り上げランキング : 79254

Amazonで詳しく見る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です