[iPhone SDK] iOS 4で導入された Blocks とは
Game Center を試していると、たくさんの^ (Caret というらしい。自分はハットと覚えたが) が出てきて、違う言語のコードを読んでいるような気になるが、これは、iOS 4 で導入されたBlocks の構文だ。
Blocks はAppleがドキュメントを用意してくれているのだが、まだよく分かっていないのでWebを放浪しながら理解しようと試みてみる。
A Short Practical Guide to Blocks
Blocks Programming Topics
この記事はよかった。
Programming with C Blocks on Apple Devices
しかしBlocksひとつでこんなに長い説明が必要になるとは。
ブロックの定義の書き方
戻り値の型 (^ブロック名)(引数の型)
ブロックの実装の書き方
^(戻り値の型)(引数の型 引数名) {
};
例
int (^Multiply)(int, int) = ^(int)(int num1, int num2) { return num1 * num2; }; int result = Multiply(7, 4); // result is 28
実際には、
- 返り値の型が返り値から分かる場合には、返り値の型を省略できる
- 引数が無い場合は省略できる
というルールがあるので、^(void)(void) {}; と書くことはなく、^{}; となる。
これもよく見るパターンだ。
また、返り値の型は返り値から判断できるので、たいてい返り値の型は省略されるようだ。
ブロックはCの拡張とObjective-Cの拡張があるので、それもわかりづらさを助長している。
また、ブロックはスタック領域(自動変数の領域)にとられるので、何もしないとメモリが解放されてしまう。このため、Block_Copy したり、copy したりしないといけない。
これも記述的にかなりややこしくなる要因の一つだ。
例えばこんな感じで、ブロックを返す場合には copy して、後で解放されるようにautoreleaseもする必要があるようだ。
typedef void(^BasicBlock)(void);
@interface LogMessage : NSObject {
NSString *logLevel;
}
@end
@implementation LogMessage
-(BasicBlock)printLater:(NSString*)someObject;
{
return [[^ {
NSLog(@"%@: %@",
logLevel, // (1)
someObject // (2)
);
} copy] autorelease]; // (3)
}
@end
まだBlocksのことが載っている本は少ないと思うが、この本には一応数ページ載っていたので紹介。
Objective-C逆引きハンドブック | |
![]() |
林 晃
シーアンドアール研究所 2010-02-26 おすすめ平均 |
関連記事
-
-
Photoshop のバッチ処理でiOSアプリアイコンを一括作成する
毎回苦労しているiOSのアプリアイコン作成。今回はPhotoshopのバッチで作成してみる。前回は
-
-
EverLearn 1.8.0をリリースしました
以前から、iOSから英単語をPebbleに転送できるアプリを作っていましたが、今回はPebbleの画
-
-
iPad Air 2 OpenAL再生でプチノイズ発生(更新あり)
新アプリが動き始めたので、TestFlightを利用してベータテストを行っている。自分のiPad2や
-
-
EverLearn Ver.1.6 を公開しました。今回はiPhone6 Plus 対応+英英辞書追加
残念ながらあまり売れていないiPhoneアプリ EverLearn ですが、自分的には毎日使っている
-
-
“I think the stainless steel looks beautiful when it wears” from The Perfect Thing
傷が付きやすいと言われている iPhone 7 ジェットブラック。ケースを付けるか迷ったら、下記
-
-
[iPhone SDK] sqlite 学習中。FMDB を知る。
SQLite入門 第2版西沢 直木 翔泳社 2009-05-19売り上げランキング : 17582
-
-
Pro iPhone Game Development は発売延期らしい
面白そうだったので結構前にAmazonで注文したのだが、ずっと発売されず、おかしいとおもって発売元の
-
-
iOS 13の新機能をざっくり把握する本 購入
https://twitter.com/shu223/status/11517528848553
-
-
Corona SDK 調査5日目
スクリプト言語による効率的ゲーム開発を読み進めている。 そろそろソースコードを読んでみようと思って本
-
-
[iPhone SDK] Adhoc 配布にようやく成功
iOS SDK Hacksのおかげで、今までずっと失敗していた Adhoc配布に、ようやく成功。