*

Xcode6&Objective-Cにおけるブロック構文(Blocks記法)の利用方法

公開日: : 最終更新日:2014/11/15 Objective-C , ,


スポンサードリンク



Xcode&Objective-CにおけるBlock構文の説明のエントリーとなります。
Block構文は、iOS(iPhone、iPad)における非同期処理を実現するための「オペレーションオブジェクト」や「GCD(Grand Central Dispatch)」で基本となる知識です。

言語をSwiftにした関連エントリーも後日作成する予定です。
利用しているXcodeは6.1です。

本エントリーの内容な以下の通りです。

  1. Block構文の基本
  2. Block構文を利用(定義、宣言)する方法

 

1 Block構文(Block Literal Syntax)の基本

Block構文を利用する方法は数種類存在しますが、まずはtypedefでブロックを定義し利用する方法を説明させていただきます。

typedefによるBlockの宣言(Declare A Block as a typedef)

型としてBlockを宣言し、その型を実体化し、処理内容を代入します。

型としてBlockを定義する方法

型としてBlockを定義する方法は以下の通りです。

returnTypeが戻り値の型、TypeNameが定義する型の名前、parameterTypesが引数リストとなります。

定義した型の利用方法

定義した型の利用方法は以下のように型を指定して処理を指定します。

上記の例ではTypeName型のblockNameを宣言した時点でブロックの実際の処理を指定していますが、以下のように別々にすることも可能です。

ブロックへの処理内容の代入時のreturnTypeは省略可能です。

Block構文の実際の利用例

戻り値も引数もないブロック

戻り値も引数もないブロックのサンプルは以下の通りです。
typedefにおける型の定義時に戻り値としてvoidを指定する必要がありますが、それ以外はvoidを明示的に記述する必要はありません。

戻り値がNSStringd、引数がintのブロック

戻り値がNSStringd、引数がintのブロックのサンプルは以下の通りです。

戻り値がNSStringd、引数がintなのでtypedefでの型宣言時にはtypedef NSString* (^BlockSampleTypeName)(int);との記述となります。
ブロックの動作(7行目のイコールの右)の指定部分では引数の型と引数名を指定する必要がありまが、戻り値の指定は必須ではありません。
必須ではありませんが
BlockSampleTypeName blockSample = ^NSString*(int intValue) {
のように書いても問題ありません。

ブロック利用時のローカル変数の扱い

ブロックのコード内でローカル変数(ブロック外の変数)を参照することが可能です。

ブロックのコード内でローカル変数を参照することは可能ですが、ブロック変数の実際の処理が確定した時点でローカル変数の値も固定化されます。
よって、ブロックの処理が代入された後のlocalValueの値の変更をブロックは無視します。

上記コードの実行結果は以下のようになります。

blockSampleの処理内容が代入された後にlocalValueには200が代入されていますが、その代入の直後に実行されたブロックの処理ではlocalValueは100のままとなっています。

localValueをブロックの処理で固定化したくない場合は__block修飾子をlocalValueの宣言時に付与する必要があります。

上記コードの実行結果は以下のようになります。

localValueが200になっていることが確認できます。
__blockを付与することによってブロック処理からlocalValueを更新することが可能になります。
更新した値はブロック実行後のlocalValueに反映されます。

実行結果は以下の通りです。

以上がBlock構文の基本となります。

2 Block構文を利用(定義、宣言)する方法

Block構文を利用(定義、宣言)する方法は先ほど説明させていただいたtypedefを用いた方法以外にも数種類存在します。

  • ローカルのブロックとして作成、利用する方法(As a local variable)
  • プロパティとして宣言して利用する方法(As a property)
  • メソッドのパラメータとして利用する方法(As a method parameter)

ローカルのブロックとして作成、利用する方法

以下のようにブロックを作成し、作成したブロックを呼び出します。

実際の利用例は以下の通りです。

プロパティとして宣言して利用する方法

クラスのプロパティとしてブロックを作成し、作成したブロックを呼び出します。
プロパティとしてブロック宣言する時には属性としてnonatomic, copyを指定します。

BlockSampleクラスのプロパティとしてブロックを宣言してみます。

BlockSample.hは以下の通りです。

BlockSample.mは以下の通りです。って空ですね。

BlockSampleクラスを利用するmainは以下のようになります。

「ローカルのブロックとして作成、利用する方法」とほとんど同じです。宣言する場所が変わっただけです。

メソッドのパラメータとして利用する方法

メソッドのパラメータとしてブロックを指定し、実際のメソッド呼び出し時にブロックの動作を引数として渡すことができます。
当然メソッドの内部でブロックを実行することができます。DI(Dependency injection)とまでは言えませんが、動的な動作をメソッド呼び出し時に指定することが可能になります。

メソッド定義時は以下のようにブロックを指定します。

メソッドの呼び出し時には以下のようにブロックの処理を指定します。
[レシーバー someMethodThatTakesABlock:^returnType (parameters) {ブロックの実際の処理}];
これはブロック構文の全てにおいて言えることですが。ブロックの処理の指定(代入)を行う時はreturnTypeは省略可能です。

実際の利用例として以下のシグネチャーのメソッドを実装してみました。

someMethodThatTakesABlockメソッドの引数として、戻り値がint引数がintのブロックとintを指定する物です。

BlockSample.hは以下のようになりました。

BlockSample.mは以下のようになりました。
someMethodThatTakesABlockはblockSampleNameをsomeMethodThatTakesABlockの第二引数を引数として呼び出しリターンするだけです。

main.mは以下のようになりました。

実際に実行した時のログは以下の通りです。

ブロックに渡した引数の値をログに出していないので分かりにくいですが、main.mの14行と20行のintValue:20がsomeMethodThatTakesABlockの第二引数となりますので、この値を引数としてブロックの処理(一回目の呼び出しだと12、13行目、2回目の呼び出しだと18、19行目)が実行されます。


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcode(Objective-C)のデリゲートとプロトコルの使い方[前編]

Xcode(Xcode5でも同様)でアプリ開発をしていて、少し複雑な事をしようとするとデリゲートと言

記事を読む

Xcode5&Objective-Cでセグエを利用して画面遷移を実現する。[後編:データのやり取り]

では、セグエを利用した画面遷移を実装しました。 後編では、各画面間でデータのやり取りを行えるよ

記事を読む

Xcode5の「Auto Layout」機能の使い方[簡単な画面レイアウトを構成してみる。]

「基礎知識と制約(Align:アライメント)の設定方法」 で「Auto Layout」機能の利

記事を読む

Xcode5でInterface Builderの接続状態の確認と切断を行う。

「Xcode5で画面コンポーネントを利用するための基本」で本来説明すべき内容でしたが あちらのエン

記事を読む

Xcode5のナビゲーションエリア[プロジェクト、シンボル、検索]の使い方

Objective-Cでコーディングを行うための統合開発環境のXcodeの利用方法のエントリーです。

記事を読む

Xcode5で画面コンポーネント(UIコンポーネント)配置して利用するための基本

iOSアプリケーションは当然ですが、画面がありますよね。 言わずもがなですが、iOS向けのアプ

記事を読む

Xcode5でUnitTest(XCTestフレームワーク)を利用してみる。

Xcode5(iOS7対応バージョンの統合開発)を利用するので、当然言語はObjective-Cです

記事を読む

Xcode&Objective-Cのまとめエントリー

エントリーもまずまず揃ってきたので、まとめのエントリーを作成しておこうと思います。 基本的には、各

記事を読む

Xcode5でSchemeを利用する。[前編]

Xcode5の「Scheme」の作成方法や使い方のエントリーとなります。 思った以上に内容が多くな

記事を読む

Xcode5のEmpty Application templateでStoryboardを利用する。

Xcode5のEmpty Application templateでStoryboardを利用する方

記事を読む

Message

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

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑