【12-B-1】 実例で学ぶ Objective-C 2.0 と GUI の関係~ iPhone...

Preview:

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言語で記述

Recommended