*

iOSプログラミングのキモ(Delegate iOSプログラミングで避けて通れないしくみ)

公開日: : Apple, iOS, iPad, iPhone, Objective-C, XCode

Delegate(委任)の考え方を説明します。iOSのプログラミングでは このDelegateが頻繁に出てきます。Delegateを導入することのメリットは以下のものがあります。

  1. 予め決められた名前のメソッドを実装することで、プログラムに規則性が出来 実装効率があがる
  2. 規則性が出来る事で プログラムの汎用性があがる
  3. 汎用性があがることで 独立したライブラリとして利用できる

Delegateはプログラミング・デザインパターンでいうところの
Proxyパターンに相当します。

下の図は Delegateの実装パターン例です、図をクリックすると拡大表示します。

Delegate実装例.001

AppDelegate.mも名前の通り Delegate(委任)され 決められたメソッドを実装しています。
下記に代表的なDelegateメソッドを挙げておきます。

UIApplication.hから一部抜粋(詳しくは、一度 UIApplication.h を直接見て下さい。)

 - (void)applicationDidFinishLaunching:(UIApplication *)application;
 - (void)applicationDidBecomeActive:(UIApplication *)application;
 - (void)applicationWillResignActive:(UIApplication *)application;
 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
 - (void)applicationWillTerminate:(UIApplication *)application;

Delegateメソッドは 実装しなくてもいいメソッドもありますが、上記に挙げたメソッドは 実装することが多いメソッドです。特に applicationDidFinishLaunching はアプリの初期化の最初に呼ばれるメソッドで、各種 ViewController、データベース、ネットワーク等の初期化等の実装に、よく使われます。

Delegateの定義には @protocol を使って定義します(JavaやPHPでいうところのInterface)、QTubeで使っている、ライブラリの定義を見てみましょう。

 @protocol MWFeedParserDelegate
 @optional
 - (void)feedParserDidStart:(MWFeedParser *)parser;
 - (void)feedParser:(MWFeedParser *)parser didParseFeedInfo:(MWFeedInfo *)info;
 - (void)feedParser:(MWFeedParser *)parser didParseFeedItem:(MWFeedItem *)item;
 - (void)feedParserDidFinish:(MWFeedParser *)parser;
 - (void)feedParser:(MWFeedParser *)parser didFailWithError:(NSError *)error;
 @end

@protocolで定義されたメソッドを実装することをインプリメントと表現しますが、インプリメントの際には 宣言が必要です。

AppDelegate.hより

 @interface AppDelegate : UIResponder

上記では の部分が 宣言に相当します、<> の中をカンマ(,)で区切ることで複数のprotocol実装を宣言することも可能です。

逆に @protocol 実装されたクラスを呼び出す側は こんな宣言をします。

 id  delegate;

上記のdelegate変数に インスタンスを接続する必要がありますが、こんな感じの書き方をよくします。selfはインスタンス自身を指します。

 feedParser.delegate = self;

その後、Delegateメソッドを呼ぶ際には こんな感じになります。

[delegate feedParserDidStart:self];

少々、わかりづらいですが iOS・Objective-Cプログラミングでは 頻繁に出てきますし、QTubeでもよく使っているので 今後も都度 説明していきます。

関連記事

FileQ iOS版を開発しようと思った理由

私の会社では FileQというファイル転送サービスを 2008年3月末から始めています、かれこれ6年

記事を読む

iOSプログラミングのキモ(iOS7から使えるようになったマルチタスク機能、NSURLSessionUploadTask の困った現象)

このブログでも度々書いてきたFileQ iOS版ですが、今月末に Appleに申請できそうな

記事を読む

iOSプログラミングのキモ(デバッグをやりやすくするための工夫:コンソール・ログの出し方 )

iOS上でプログラミングをする時、ログ出力用の関数としてNSLogという関数をよく使います。NSLo

記事を読む

iOSプログラミングのキモ(デバッグをやりやすくするための工夫:Debug.hのインクルード )

前回 紹介した Debug.h は、使う際 以下のようにソースファイル(ここでは拡張子が m のもの

記事を読む

iOSプログラミングのキモ(iOS7から使えるようになったマルチタスク機能、NSURLSessionはこう使え!)

今日はQTubeのソースに関する話題ではなく、現在開発中のアプリで使っているNSURLSession

記事を読む

iOSプログラミングのキモ(拡張子がpchというファイルの役目)

XCodeで プロジェクトを作成すると、-prefix.pch というファイルができています。このフ

記事を読む

iOSプログラミングのキモ(行き当たりばったりなプログラミングでも、何とか形にするために守っていること その2)

先週に引き続き、今週も文字中心のエントリーです、今回は 下記3つのことを書いていきます。 M

記事を読む

iPhoneが7GBの転送制限に引っかかりそうになって Nexus7(2013)LTE版のテザリング機能が大活躍

皆さんは スマホを使ってて、転送制限に引っかかったことはありますか?私はあります(笑) 最

記事を読む

iOSプログラミングのキモ(2:AppDelegate説明 )

実際の AppDelegate.h、AppDelegate.m のソースコードです AppDe

記事を読む

iOSプログラミングのキモ(複雑な画面を複数のViewControllerで制御する その1)

久々に、プログラミングの話です(^^; 今日は 機能が複雑な画面を 複数のViewContro

記事を読む

Message

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

FileQ Hosting 月額99円 容量1GB


サイト管理 Mezzanine
Django上で動くCMS Mezzanine 用のモジュールを作ってみる その1

Django上で動くCMS Mezzanine上で動く、モジュールを作

ホーム Mezzanine
Django上で動くCMS Mezzanine を インストールする MacOSX Yesemite 編

Mezzanineは Django WEBフレームワーク上で動くCMS

EclipseにGWT(Google Web Toolkit) Plugin for Eclipseを入れようとしてハマった

最近PHPでちょっとした業務システムを作りました。業務システムの特徴と

ブログを半年やった成果を Google Analytics から眺める

今年の1月からブログを書き始め、そろそろ半年が経とうとしています。

母校で特別 講義をやってきました。

少し 間が空いてしまいました(^_^;) ちょっと前になりますが

→もっと見る

mautic is open source marketing automation
PAGE TOP ↑