[iPhone SDK] iOS 4で導入された Blocks とは

公開日: : 最終更新日:2010/09/14 iPad, iPhone ,

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逆引きハンドブック
Objective-C逆引きハンドブック 林 晃

シーアンドアール研究所 2010-02-26
売り上げランキング : 6274

おすすめ平均 star
starついに出た日本語リファレンス
star初心者に優しくない内容

Amazonで詳しく見る by G-Tools

関連記事

no image

有料iPhoneアプリを売る手続き

AppStoreで無料アプリを配布している分には必要ない手続きだが、有料アプリを売ろうと思うといろい

記事を読む

no image

[iPhone SDK] sqlite 学習中。FMDB を知る。

SQLite入門 第2版西沢 直木 翔泳社 2009-05-19売り上げランキング : 17582

記事を読む

iPhone/iPad にMIDIキーボードを接続する

iPhone や iPad に MIDI キーボードが接続できると、実際のキーボードをつかって操作が

記事を読む

Xcode6 を使うために強制的に Mavericks にアップグレードさせられたら重い

Mavericks の不具合をさけるためにわざわざ Mountain Lion (10.

記事を読む

リズムくんHD 1.2.1 で iOS11に対応しました

iPad用のリズムくんHD のiOS11対応が遅れてしまったため、2017年11月あたりからiOS1

記事を読む

no image

派生クラスを変更し忘れて半日はまる

こんなコードを書いて半日はまっていた。 SettingViewController は UITa

記事を読む

no image

薄い iPad2用ケース eggshell for iPad2 TUN-PD-000079 購入 2011/06/27

不具合報告があったので、当初予定がなかったiPad2を購入。 それはまた別に書くとして、まずは一緒に

記事を読む

no image

SHIELD iShell iPhone 4 用ケース購入

奥さんのiPhone 4用に SHIED iShell iPhone 4 シェルカバーを購入。Ama

記事を読む

no image

Corona SDK 調査5日目

スクリプト言語による効率的ゲーム開発を読み進めている。 そろそろソースコードを読んでみようと思って本

記事を読む

no image

iOS Developer Program 更新のため Developer Certificates を更新

この前iOS Developer Programを更新したが、1年経ったので Developer C

記事を読む

Message

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Ember Mug 2のACアダプタをUSB Type-Cに変えてみた

冬になると活躍する Ember Mug 2 の充電器は付属のACアダ

Wi-Fi6Eルータ TP-Link AXE5400購入

Wi-Fi6E を試してみたくなり、TP-Link AXE5

児童手当 認定請求書申請 2024 「請求者が養育をする18歳に達する日以降の最初の3月31日までの子の数」とは?

2024年に受給していない人には手紙が届くらしい。 電子申請も

Vision Proアプリ開発本 8/24、8/26に発売

Vision Proアプリ開発入門 P400が 8/24 に発売、V

Developer Strap が日本でも購入可能に

USアカウントでしか購入できなかった Vision Pro 用 De

→もっと見る

PAGE TOP ↑