アプリケーションのライフサイクル(3)

2010. 04. 18
イベントループの話をするために『アプリケーションのライフサイクル(1)』という所から始めたんですが、ことイベントループそのものが何処でどう動いているのか判然としていなく、明瞭な説明ができないことを先にお詫びいたします。

3)イベントループ(イベント処理サイクル)

前回の『アプリケーションのライフサイクル(2)』おさらいをしますと、

main()関数の呼び出し
元がC言語なので、最初に読み込まれるのがmain()関数なのは理解できる。



UIApplicationMain()関数の呼び出し
UIApplicationのインスタンスとデリゲートを生成。
第3引数でUIApplicationのインスタンス、第4引数でデリゲートの指定をしている。



アプリケーションデリゲートの作成
システムイベントにデリゲートが応答する

と、ここまで書いて『どこでイベントループを作っているんだろう』とあれこれ調べましたが皆目検討がつかず、UIApplicationMain()関数の内部で作っていて、表に見えていないんだろうと思うことにしました。
(合っているかどうかは分かりませんが)

この辺りはテンプレートを使えば自動生成される部分でもあり、特にmain()関数は手を加えることもあまり無いので、目に見える部分に気を配れば中身は概念さえ抑えておけばいいということなのかもしれません。

iOSアプリケーションプログラミングガイド』の『イベント処理サイクル』の話を解説しようかとも思いましたが、途中からよく分からなくなるので諦めました。
(プロセスとかスレッドとか出てくる辺りから意味不明)

仕方ないので一般的なイベントループの概念だけでも紹介します。


・イベントループの概念

まず『イベント駆動(イベントドリブン)』の話から。

ここで言うイベントとは、『画面をタッチした』『デバイスを回転させた』などのユーザが行う行為や、『電話がかかってきた』などのシステムからの通知も含めた、プログラムに対するメッセージのことです。

イベントの発生(トリガ)によるメッセージをプログラムが受けて応答することをイベント駆動と言います。

プログラムはイベントが発生するまでは待機状態で(表向きは)何もしませんが、常にイベントを受け取る準備をしており、イベントを受けたら応答してまた待機するということを繰り返します。
これをイベントループと呼びます。

イベントはまずOSが受け取り、一旦イベントキューに置かれ、アプリケーションに渡されます。

イベントキューとは待機場のことで、アプリケーションがイベントを処理して待機状態に戻るまでのバッファの役割を果たします。

複数のイベントが連続して発生した場合、アプリケーション側はイベントキューから並べられた順番にイベントを取り出して処理します。

iPhone OSの場合、イベントはUIApplicationMainオブジェクトのイベントループに渡されます。

UIApplicationMainオブジェクトはデリゲートと協調し、受け取ったイベントを適切なオブジェクトに処理させます。

以上、(それくらいなら誰でも知っている)イベントループの話でした。

オマケとして、何か手掛かりがあるかと思って訳したUIApplicationクラスの概要を、せっかくなので載せておきます。

・UIApplicationクラスの概要

UIApplicationクラスはiPhone OSで実行するアプリケーションの制御と調整を集中管理するものです。

全てのアプリケーションは必ずUIApplication(もしくはUIApplicationのサブクラス)のインスタンスを持ちます。

アプリケーションが起動するとUIApplicationMain関数が呼び出され、シングルトンのUIApplicationオブジェクトを作成します。

その後、sharedApplicationクラスメソッドで、このオブジェクトにアクセスできるようになります。

UIApplicationオブジェクトの主な役割は、ユーザからのイベントを最初に受け取ることです。

そしてコントロールオブジェクト(UIControl)により、適切なターゲットオブジェクトへアクションメッセージを送ります。

さらにUIApplicationオブジェクトは、アプリケーションが現在開いている全ウィンドウ(UIWindowオブジェクト)のリストを保持し、そこからアプリケーションのUIViewオブジェクトを取得します。

アプリケーションオブジェクトは通常デリゲートを割り当て、アプリケーションに重要なランタイムイベント(例えばアプリケーションの起動、メモリ不足の警告、アプリケーションの終了)を適宜知らせ、応答できる機会を与えてくれます。

アプリケーションは、openURL:メソッドで送られたメールやイメージファイルなどのリソースを協調処理できます。

例えばアプリケーションがメールのURLを開くと、このメソッドがメールクライアントを起動しメッセージを表示することができます。

iPhone OS 3.0では、リモート通知の登録、アンドゥーリドゥ(取り消しーやり直し)UI(applicationSupportsShakeToEdit)、インストールされたアプリケーションがURLを開けるかどうか決定する(canOpenURL:)などがUIApplicationのメソッドに追加されています。

UIApplicationは、一つ以上のメソッドを実行する、UIApplicationDelegateプロトコルを採用したデリゲートを定義します。

UIApplicationとUIApplicationDelegateのインターフェイスにより、デバイス固有の動作を管理することができます。

これにより、デバイスの向きによってインターフェイスの方向を変えたり、ユーザイベントを一時的に保留したり、近接センサーにより画面のオン/オフしたり、アプリケーションの応答を制御できます。

サブクラス化の注意

カスタムイベントとアクションディスパッチを実装する場合は、UIApplicationのサブクラスであるsendEvent:またはsendAction:to:from:forEvent:をオーバーライドしてください。



参考文献

iOSアプリケーションプログラミングガイド

UIApplication Class Reference

福井高専IT研究会OfficialWiki/UIApplication

Wikipedia/イベント駆動型プログラミング

Wikipedia/イベント(プログラミング)

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る






bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

bose_soundlink_revolve
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR