Upload
devsumi2009
View
3.062
Download
0
Embed Size (px)
Citation preview
荻原剛志京都産業大学コンピュータ理工学部 教授
12-B-1
実例で学ぶ Objective-C 2.0 と
GUI の関係 ~ iPhone アプリ開発を視野に入れて
(C)2009 T. Ogihara
プログラミング言語の歴史(一部のみ)
(C)2009 T. Ogihara
GUIの歴史
● 現在のGUIの構成要素をすべて備えていた。
✦ 3ボタンマウス✦ ビットマップディスプレイと「ウィンドウ」の表示
✦ Ethernet network.
(一部のみ)
(C)2009 T. Ogihara
NeXTstep
アプリケーション記述に Objective-C を採用した。
(C)2009 T. Ogihara
NeXTstep
(C)2009 T. Ogihara
NeXTstep
(C)2009 T. Ogihara
Objective-C
C言語にオブジェクト指向を取り入れた言語。概念や記法はSmalltalkをまねている。
新たな記法以外、基本的には ANSI C の書き方が使える。(C++とは違う言語)
C言語の高速、緻密な処理とオブジェクト指向の柔軟性、拡張性を合わせ持ったプログラミングが可能。
(C)2009 T. Ogihara
Objective-C (歴史)
1983年にBrad Coxが開発(Stepstone社) NeXTコンピュータ(1988年)の主力言語に 1996年、Apple社がNeXT社を買収 Mac OS X(2000年~)の主力言語に採用 Objective-C 2.0 が発表される(2007) iPhone(2007年~)の主力言語として採用
オブジェクト指向の部分
オブジェクト指向らしくするために追加された機能
オブジェクト指向とは関係のない追加・拡張機能
C++ =
(C)2009 T. Ogihara
C++はCの拡張 既存の Cのプログラムを C++ に移行させたり、C++ と
C のコードを共存させることが可能。
C
オブジェクト指向の部分
Objective-C =
(C)2009 T. Ogihara
Objective-C は C言語の上位互換
既存の Cのプログラムを Objective-C のプログラム内にそのまま混ぜて共存させることが可能。
ハイブリッド言語
Cオブジェクト指向らしくするために追加された機能
オブジェクト指向とは関係のない追加・拡張機能
(C)2009 T. Ogihara
他のOO言語との比較 (1)
コンパイラ言語である。 型チェックが緩い。 多重継承、Mixin、ジェネリックはない。 Javaの「インタフェース」は Objective-
C が元祖。 ガーベジコレクションは一応利用可能。
(C)2009 T. Ogihara
他のOO言語との比較 (2)
C++ の参照演算子「&」や、名前空間や「::」はない。
演算子のオーバーローディングはない。 関数、メソッドの引数の省略機能はない。 C#のような「プロパティ」を持つ。 クラスもオブジェクトである。
(C)2009 T. Ogihara
他のOO言語との比較 (3)
インスタンスはヒープ領域にとられる。 基本型(int他)はオブジェクトではない。
(C)2009 T. Ogihara
Objective-C 2.0の新機能
Appleが明示する3つの新機能 ガーベジコレクション 宣言プロパティ 高速列挙
宣言プロパティは便利だが、従来の1.0までのプログラミングでも不便はない。
ランタイムシステムが大幅に変更された
(C)2009 T. Ogihara
メッセージ式 (1)
オブジェクトは、どのクラスに属するものでも id という特別な型で表現できる。
id obj; /* 変数の宣言 */
オブジェクト obj にメッセージを送ることを次のように記述し、メッセージ式と呼ぶ。
[ obj msg ]
(C)2009 T. Ogihara
メッセージ式 (2)
メッセージに引数がある場合、メッセージキーワードに " : " を付け、その後に実引数を書く。 [ obj msg:100 ]
[ obj msg:100 param: N+1 ]
メッセージ式は、そのメッセージを処理した結果の値を返す。
r = [ obj msg:15 ];
(C)2009 T. Ogihara
クラス定義
@interface クラス名 : スーパークラス名{ インスタンス変数の宣言; ...}メソッドの宣言; ...@end
通常はヘッダファイルに記述する
(インタフェース部)
(C)2009 T. Ogihara
クラス定義
@implementation クラス名- (id)initWithName:(NSString *)str{ メソッドの定義(C言語の関数と同様) ...} ...@end
C言語の関数も混ぜて記述できる
(インプリメント部)
(C)2009 T. Ogihara
動的結合
メッセージの処理は、動的結合とポリモーフィズムを基本とする。
virtual, final などは指定しない( C++, Java, C# などと異なる)。
送ったメッセージが存在しなければ、実行時エラーとなる。
(C)2009 T. Ogihara
メモリ管理
Mac OS X の実行環境ではリファレンスカウンタ方式を用いてメモリを管理。
Mac OS X 10.5 (Leopard) からは、ガベージコレクション方式も併用可能。
OS X iPhone ではリファレンスカウンタ方式のみ。
(C)2009 T. Ogihara
セレクタとメッセージ送信
セレクタ(と引数)を指定してメッセージを送ることができる。
セレクタはプログラム中では @selector( ) で表す。
呼び出されるメソッドは、セレクタが同じでもレシーバによって異なる(関数のポインタなどと動作原理が異なる)。
(C)2009 T. Ogihara
セレクタとメッセージ送信
[obj show];
[obj performSelector:@selector(show)];
同じ動作
同じ動作SEL s = @selector(show);[obj performSelector: s];
セレクタは SEL型
(C)2009 T. Ogihara
ターゲット-アクション・パラダイム
Cocoaアプリケーションでオブジェクト同士を連携させるための基本概念。
メッセージを送る相手をターゲット、送るメッセージをアクションと呼び、その双方を動的に変更できる。
GUI制御には、Cocoaバインディングという方法もある。
(C)2009 T. Ogihara
ターゲット-アクション・パラダイム
ターゲットとなるオブジェクトのクラスは、実行時まで分からなくてもよい 知らない相手にメッセージ送信が可能 部品化を柔軟に実現
ターゲット
アクション show:
(C)2009 T. Ogihara
ランタイムシステム
Objective-C の動的な振る舞いを実現するために、オブジェクトの生成、解放に伴うメモリ領域の管理、メソッドの探索などを行う。
プログラムからは、主にルートオブジェクトである NSObject を通して利用。
(C)2009 T. Ogihara
システム階層
Mac OS X OS X iPhone
QuickTime
アプリケーションサービス
コアサービス
カーネル環境
Carbon
Cocoa
JDK
BSD
Cocoa Touch
メディア
コアサービス
コアOS
AppKitフレームワーク UIKitフレームワーク
(C)2009 T. Ogihara
例題プログラムの概要
階層的なビューでマウス(タッチ)を処理する基本的なプログラム
できあいのGUI部品ではなく、自分でカスタムビューを作ってみる
ターゲット・アクションの仕組みを実装
(C)2009 T. Ogihara
例題プログラムの概要
背景のビューをクリックすると新しいボタンが出現する
ボタンをクリックすると色が変わる
ビュー
ボタン
別のボタンにも動作が波及する
(C)2009 T. Ogihara
例題プログラムの実装
クリックによって新しいボタンを作る
ボタンもカスタムビューとして実現
ビュー
ボタン別のボタンをターゲットとして参照する
BaseView
MyButton
(C)2009 T. Ogihara
iPhoneプログラミング
ターゲット-アクションの概念はそのまま Foundationフレームワークはほぼ同じ AppKit → UIKit は雰囲気は似ている グラフィックなどの APIでは Core
Foundation を使う場面が多い 高速化が必要な部分はC言語で記述