ブロックオブジェクト


ブロックオブジェクトは、引数、必要に応じて格納され、複数のスレッドで使用できる関数表現を構成できるようにする C レベルの統語と実行時の機能です。関数表現は、参照でき、ローカル変数へのアクセスを保護できます。他の言語や環境では、ブロックオブジェクトは、時々クロージャまたはラムダ関数と呼ばれています。それらが値を持っているかのように渡されることができる作業単位を作成(つまり、コードセグメントである) したいときに、ブロックを使用します。ブロックは、より柔軟な、より強力なプログラミング能力を提供します。例えば、コールバックを記述したり、コレクションのすべての項目で操作を実行するために、それらを使えます。


ブロックの宣言


多くの状況では、インラインブロックを使用し、それらを宣言する必要はありません。しかしながら、アスタリスクポインタ(*)の代わりにキャレット(^)を使用する点を除いて、宣言構文は、関数ポインタの標準構文と似ています。たとえば、次の例文では、3つのパラメータが必要な、float 値を返すブロックを参照する変数 aBlock を宣言します。


float (^aBlock)(const int*, int, float);


ブロックの作成


ブロック式の始めを示すためにキャレット(^)演算子を使用し、終わりを示す為にセミコロン(;)を使います。次の例は、単純なブロックを宣言し、以前に宣言したブロック変数(oneFrom)に割り当てます。


int (^oneFrom)(int); oneFrom = ^(int anInt) { return anInt - 1; };


最後の閉じるセミコロンは、標準の C の行末マーカーとして必要とされます。


明示的にブロック表現の戻り値を宣言しない場合、自動的にブロックの内容から推測することができます。


変更可能なブロックの変数


__のブロックストレージ修飾子を使用することで、ローカルに変数を宣言し、このような変数は、ブロック内の参照によって提供され、そのように変更可能であることを示すために囲んで構文スコープに宣言されています。すべての変更は、同じ外側の構文スコープ内で定義され、他のブロックを含め、囲む構文スコープに反映されています。


ブロックを使用する


変数としてブロックを宣言した場合、機能(関数)として機能するように使用することができます。以下の例では、出力として 9 を印刷します。


printf("%d\n", oneFrom(10));


しかし、典型的には、関数の引数やメソッドなどのブロックを渡します。これらのケースでは、多くの場合、ブロックをインラインで作成して下さい。


以下の例は、NSSet のオブジェクトがローカル変数で指定された word を含んでいるかどうかを判断し、別のローカル変数(found) に値を設定し YES に設定し、(検索を停止します) もしそうなら。以下の例では、found は、__block 変数として宣言されています。


__block BOOL found = NO; NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil]; NSString *string = @"gamma"; [aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) { *stop = YES; found = YES; } }]; // At this point, found == YES


この例では、ブロックは、メソッドの引数リスト内に含まれています。ブロックも、スタック・ローカル変数を使用して作られています。


比較演算


Cocoa 環境内のブロックで実行される、より一般的な操作の1つは、2つのオブジェクト間の、たとえば、配列の内容を並べ替えて比較する事です。Objective-C の実行環境がブロックタイプを定義し - NSComparator - これらの比較のために使用します。


前提条件の記事

メッセージ


関連記事

列挙


既出の議論

ブロックでの作業






次の章
前の章
目次
Xcode の新機能

インターフェースビルダー ヘルプ
NSObject(class)
概要(NSObject,class)

  • アクセシビリティ
  • VoiceOver での作業
  • アクセサメソッド
  • 命名規則
  • アプリ ID
  • 明示的なアプリ ID は、一つのアプリに一致
    ワイルドカードアプリ ID は複数のアプリに一致
    アプリコード署名
  • ブロックオブジェクト
  • ブロックの宣言
    ブロックの作成
    変更可能なブロックの変数
    ブロックを使用する
    比較演算
  • バンドル
  • バンドルの構造と内容 バンドルリソースへのアクセス
    ロード可能なバンドル
  • カテゴリ
  • 宣言
    実装
  • クラスクラスタ
  • 利点
    検討事項
  • クラスの定義
  • インターフェース
    実装(Implementation)
  • クラスメソッド
  • サブクラス
    インスタンス変数
    self
  • ココア(タッチ)、Cocoa(Touch)
  • フレームワーク(Framework)
    言語
    コーディング規則
  • コレクション(Collection)
  • コレクションクラス
    順序付けスキーム
  • コントローラーオブジェクト
  • コントローラの調整
    ビューコントローラ
    仲介コントローラ(OS X)
    宣言されたプロパティ
  • デリゲート(Delegate)
  • デリゲートとココアフレームワーク
    デリゲートと通知
    データソース
    動的バインディング
  • 動的型付け
  • isa ポインタ
  • 列挙
  • NSEnumerator
    高速列挙
  • 例外処理
  • 例外の種類
    コンパイラディレクティブを使用した例外処理
    信号伝達のエラー
    フレームワーク
    情報プロパティリスト
  • 初期化
  • イニシャライザ宣言の型
    初期化子を実装
    国際化
  • 内観(イントロスペクション)
  • イントロスペクション情報の種類
  • キー値コーディング
  • オブジェクトのプロパティと KVC
    クラスを KVC に準拠させる
  • キー値監視
  • KVO の実装
    KVO はバインディングの不可欠な部分(OS X)
  • メモリ管理
  • メモリ管理の規則
    メモリ管理の側面
    メッセージ
    メソッドのオーバーライド
  • モデルオブジェクト
  • うまく設計されたモデルクラス
  • モデル・ビュー・コントローラ
  • モデルオブジェクト
    ビュー・オブジェクト
    コントローラオブジェクト
  • 複数のイニシャライザ
  • 指定イニシャライザ
    Nib ファイル
  • 通知
  • 通知オブジェクト
    通知を観察する
    通知を投稿
  • アーカイブ
  • 鍵付き連続アーカイバ
    鍵付きアーカイブの作成とデコード
  • オブジェクトの比較
  • 比較ロジックを実装する
  • オブジェクトのコピー
  • オブジェクトコピーのための要件
    メモリ管理への影響
  • オブジェクト作成
  • オブジェクト作成式の形式
    メモリ管理への影響
    ファクトリメソッド
  • オブジェクトの暗号化
  • オブジェクトの暗号化と復号化する方法
    キー付き対連続的アーカイブ
    オブジェクトグラフ
    オブジェクトのライフサイクル
    オブジェクトモデリング
  • オブジェクト可変性(mutability)
  • 可変オブジェクトを受け取る
    可変オブジェクトを格納
    オブジェクトの所有権
    Objective-C
  • プロパティ(特性)リスト
  • プロパティリストの型とオブジェクト
    プロパティリストのベストプラクティス
    プロパティリストのシリアライズ
  • プロトコル
  • 公式、非公式なプロトコル
    正式なプロトコルを採用、準拠
    独自のプロトコルを作成
    ルートクラス
  • セレクタ
  • セレクタの取得
    セレクタの使用
    シングルトン
  • 統一された型の ID
  • UTI は逆ドメイン·ネーム·システム規則を使用
    統一された型 ID は適合階層で宣言
    OS X のアプリは、アプリバンドルでそれらを定義して新しい UTIを追加
  • 値オブジェクト
  • NSValue