01.iphonegettingstarted-j

  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 01.iphonegettingstarted-j as PDF for free.

More details

  • Words: 2,377
  • Pages:
 Developer Connection

Getting Started Documents

iPhone OSの概要 iPhone OS 開発ツール Objective-Cの学習:入門 iPhone開発におけるSigning Code iPhoneアプリケーションの作成 Cocoaデベロッパ向けiPhone OS

iPhone Dev Center

-1 -

目次 iPhone OSの概要

4

iPhone OSのテクノロジーレイヤ

5

iPhone OS向けコードの記述

6

どこからスタートするか

7

iPhone OS開発用ツール

8

Xcode

8

Interface Builder

10

Instruments

10

Objective-Cの学習:入門

12

Objective-C:Cのスーパーセット

12

文字列

13

クラス(class)

13

メソッド(method)

16

プロパティ(property)

17

プロトコル(protocol)と委任(delegate)

18

詳細情報

19

iPhone開発におけるSigning Code

20

デジタル署名と識別情報(Digital SignatureとSigning Identities)

20

他のコンピュータにSigning Identityをコピーする

21

Private Keyの保管は安全に

21

どこから始めるか

22

iPhoneアプリケーションの作成

23

MoveMeサンプルプロジェクトの確認

24 -2 -

MoveMeアプリケーションのビルド

25

メモリ管理について

26

MoveMeアプリケーションの初期化

26

アプリケーションウインドウの作成

28

「Welcome」ボタンの描画

30

タッチイベントの処理

33

ボタンの動きのアニメーション化

37

アプリケーションの終了

38

アプリケーションの強化

41

加速度計を用いた向きと動きの追跡

41

ユーザの現在位置の取得

43

オーディオとビデオの再生

44

組み込みのカメラを使った撮影

45

Cocoaデベロッパ向けiPhone OS

46

Foundationフレームワーク

46

UIKitとAppKit

47

その他のフレームワークの変更

50

OpenGLに関する留意事項

51

座標系

52

メモリ管理

52

-3 -

iPhone OSの概要 iPhone OSは、iPhoneおよびiPod touchのデバイス上でアプリケーションをネイティブに実行するのに使用するオペレーティ ングシステムとテクノロジーで構成されています。iPhone OSは、共通の遺産と多くの基盤となるテクノロジーをMac OS Xと 共有していますが、ユーザのニーズが若干異なるモバイル環境のニーズに対応するように設計されました。既存のMac OS Xデ ベロッパは、慣れ親しんだ多くのテクノロジーを目にするでしょうが、Multi-Touchインターフェイスや加速度計のサポートな ど、iPhone OSにおいてのみ使用可能ないくつかのテクノロジーにも気づくでしょう。

iPhone SDKには、iPhone OSに対応したアプリケーションの開発、テスト、実行、デバッグ、およびチューニングに必要な コード、情報、およびツールが含まれます。Xcodeツールは、iPhone OSに対応した開発をサポートするようにアップデートさ れています。Xcodeは、コード用に基本的な編集、コンパイル、およびデバッグ環境を提供するほか、iPhoneまたはiPod touchデバイス上でアプリケーションをテストするための起動ポイントも提供します。Xcodeではまた、ローカルのMacintosh コンピュータ上にiPhone OSの基本環境を再現するプラットフォームであるiPhone Simulatorの中で、アプリケーションを実 行できます。

-4 -

この記事では、このプラットフォームへの入門として、iPhone OSが備えている基本的な機能の概要を説明します。iPhone Dev Centerには、さまざま情報を提供すると共に、iPhoneアプリケーションを作成するための基本的なプロセスを理解するの に役立つその他の記事もあります。iPhone OSの学習にこれらの記事を役立ててください。

図1 iPhone OSのテクノロジーレイヤ

iPhone OSのテクノロジーレイヤ iPhone OSの基盤のシステムアーキテクチャと多くのテク ノロジーは、Mac OS Xのシステムアーキテクチャやテクノ ロジーと似ています。iPhone OSのカーネルは、Mac OS X で使用しているのと同じ基本的なMachカーネルの一種に 基づいています。このカーネルの上に、プラットフォーム にアプリケーションを実装するのに使用するサービスレイ ヤがあります。図1は、こられのレイヤの概要を示します。

このレイヤ階層によって、コードを実装する際の選択肢が広がります。たとえば、Core OSレイヤおよびCore Servicesのレイ ヤには、ファイル、下位レベルのデータタイプ、Bonjourサービス、ネットワークソケットなどへのアクセスに使われる iPhone OSの基本インターフェイスが含まれています。これらのインターフェイスはほとんどがC言語ベースであり、Core Fundation、CFNetwork、SQLite、およびPOSIXスレッドやUNIXソケットへのアクセスなどのテクノロジーが含まれます。

レイヤの上位に目を向けると、C言語ベースとObjective-C言語ベースのインターフェイスが混在するさらに高度なテクノロ ジーがあります。たとえば、Mediaレイヤには、2Dおよび3Dの描画、オーディオ、およびビデオをサポートするのに使用され る基本テクノロジーが含まれます。このレイヤには、C言語ベースのテクノロジーであるOpenGL ES、Quartz、およびCore Audioが含まれています。また、Objective-C言語ベースの高度なアニメーションエンジンであるCore Animationも含まれて います。

Cocoa Touchレイヤのほとんどのテクノロジーでは、Objective-Cを使用しています。これらのレイヤのフレームワークでは、 アプリケーションで使用する基本的なインフラストラクチャが提供されます。たとえば、Foundationフレームワークは、コレ クション、ファイル管理、ネットワーク操作などでのオブジェクト指向のサポートを提供します。UIKitフレームワークは、ア プリケーションのためのビジュアルインフラストラクチャを提供します。これには、ウインドウ、ビュー、コントロール、およ びこれらのオブジェクトを管理するコントローラの各クラスが含まれます。このレベルのその他のフレームワークは、ユーザ の連絡先情報や写真情報、加速度計やデバイスのその他のハードウェア機能へのアクセスを提供します。

新しいプロジェクトはすべて、Cocoa Touchレイヤ、特にUIKitフレームワークから始めます。使用する追加のテクノロジーを 決定する際には、上位レベルのレイヤにあるフレームワークからはじめ、必要に応じて下位レベルのフレームワークへ降りて いくことをお勧めします。高位レベルのフレームワークを使用すれば、デベロッパは最小限の労力でシステムの標準的な動作を -5 -

簡単にサポートできます。下位レベルのフレームワークは、高位レベルでは提供されていないカスタムの動作を実装する場合に のみ考慮すべきです。

iPhone OSのテクノロジーの詳細については、『iPhone OS Programming Guide』を参照してください。

iPhone OS向けコードの記述 iPhone SDKでは、iPhone OS上でネイティブに実行されるグラフィカル指向のアプリケーションの作成をサポートしていま す。作成したアプリケーションは、Photos、Weather、Clockなどのほかのシステムアプリケーションとともにユーザのホーム 画面に置かれます。起動すると、カーネルおよび下位レベルのいくつかのデーモンを除けば、システム上で実行されるアプリ ケーションは作成したアプリケーションのみです。実行中は、アプリケーションが画面全体を占有しユーザの注目の焦点とな ります。ユーザがホームボタンを押すとアプリケーションは終了し、システムによってホーム画面が再び表示されます。システ ムを独り占めできると、基盤のシステムリソースに自由にアクセスできるようになるため、メリットがあります。作成したコー ドのみを実行するために、加速度計、カメラ、およびグラフィックハードウェアなどの組み込みのハードウェアを利用できま す。

ユーザがiPhoneデバイスおよびiPod touchデバイスとやり取りする方法は、ユーザがMac OS Xとやり取りする方法と基本的に 異なるため、アプリケーションの設計の仕方も異なることになります。iPhoneアプリケーションには、別々のドキュメントウ インドウを使ってコンテンツを表示するという考え方はありません。代わりに、アプリケーションのデータはすべて単一のウ インドウに表示されます。こうした理由から、アプリケーションのデータを整理して表示することのできる新しいビューとコ ントロールが作成されました。また、標準のビューとコントロールの多くは、Mac OS Xの対応するものと動作がわずかに異な る場合があります。これらの変更のほとんどは透過的ですが、変更によってはデータを構成したり表示したりする方法を考え 直す必要がある場合があります。

また、iPhone OSのイベント処理モデルは、従来のデスクトップアプリケーションのモデルとは大幅に異なります。従来のマウ スとキーボードイベントに依存する代わりに、iPhone OSではタッチイベントの概念が導入されています。タッチイベントは、 いつでも生じる可能性があり、また1つ以上の異なるタッチイベントとの組み合わせで生じることがあります。タッチは、項目 の選択やドラッグなど、コンテンツとの単純なやりとりを検出するのに使用できます。また、スワイプや、ピンチオープン (つまんで開く)およびピンチクローズ(つまんで閉じる)などの複雑なジェスチャ(たとえば、Photoアプリケーションでの ズームインやズームアウトに使用します)ややり取りにも使用できます。

アプリケーションの基本的な構造を考慮することに加えて、ユーザがアプリケーションを実際にどのように使用するかを考え る必要があります。iPhoneアプリケーションは、不要な機能を削ぎ落とした、ユーザがその場で必要としている機能を中心と したアプリケーションでなければなりません。移動中のユーザにとっては、素早く情報を入手することが大切で、複数の画面 レイヤを掘り下げるのに時間をかけたくないということを忘れないでください。ユーザが必要とする

となる情報を強調する

単純なレイアウトを提供することが大切です。ゲームやほかの娯楽用アプリケーションでは、ユーザがアプリケーションとや りとりする方法や、必要に応じて加速度計やカメラのようなテクノロジーを利用できるように考慮することも必要です。

-6 -

開発を始めるにあたって、最初に使用するフレームワークはFoundationフレームワークとUIKitフレームワークです。これらの フレームワークによって、iPhoneのすべてのアプリケーションで使用される重要なサービスが提供されます。アプリケーショ ンを高度化するためには、システム内のほかのフレームワークでどのようなサービスが提供されているか調べるとよいでしょ う。各フレームワークの文書には、該当するフレームワークの使用方法の理解に役立つ、概念説明の関連資料へのリンクが含 まれています。

FoundationフレームワークおよびUIKitフレームワークの詳細については、「Foundation Framework Reference」および 「UIKit Framework Reference」を参照してください。

どこからスタートするか iPhone OSで実行する単純なアプリケーションは、Xcodeで提供される組み込みのプロジェクトテンプレートを使用すると比 較的簡単に作成できます。しかし、何か便利で見栄えがするアプリケーションを作成するには、いくらか時間をかけて、入手 可能な文書に目を通す必要があります。少なくとも、アプリケーションを作成するためのツールやプロセスについて説明して いる、iPhone Dev Centerのその他の記事を時間をとって読むことをお勧めします。

iPhone OSおよびMac OS Xがまったく初めての場合、時間をかけてiPhone OSの基本的なデザインパターンと規則を理解する ことは、そのプラットフォーム向けのコードを書くためには重要です。フレームワークの強みを活かせば、アプリケーション はiPhone OSで最大限の能力を発揮します。時間をかけてフレームワークの基本的な動作に取り組んだとしても、単純に、使用 されている基本的なデザインパターンを学ぶ以上に困難なことに気づくでしょう。iPhoneデベロッパならば知っている必要の ある基本的な情報は、『Cocoa基礎ガイド』に記載されています。同文書では、Objective-C言語の基本と、UIKitやその他の 多くのシステムフレームワークで使用されているプログラミング規約およびデザインパターンについて説明しています。

iPhoneアプリケーションの作成に使用する基本的な規約を理解したら、開発プロセスに関する個別の詳細について、『iPhone OS Programming Guide』を参照できます。同文書では、iPhoneアプリケーションの作成方法について、主要な概念情報およ び作業内容に応じた情報を提供します。ユーザインターフェイスの表示方法、イベント処理の方法、およびiPhone OSの主要な 機能の活用方法の例も含まれます。また、開発プロセス全体について説明し、Xcodeを使用したアプリケーションのビルドや 実行の方法について説明します。

『iPhone OS Programming Guide』に加え、利用可能なサンプルコードにも目を通すことをお勧めします。iPhone OSには、 利用可能なテクノロジーを使って実際のアプリケーションを作成する方法を示す機能豊富なサンプルがいくつか付属していま す。これらのサンプルは、自分が作成するアプリケーションの出発点として使用したり、個々の機能を使用する方法を学ぶた めに参考にしたりできます。

-7 -

iPhone OS開発用ツール iPhone OS向けのアプリケーションを開発するには、Xcodeツールが動作するMac OS Xコンピュータが必要です。Xcodeは、 プロジェクト管理、コード編集、実行可能ファイルのビルド、ソースレベルのデバッグ、ソースコードのリポジトリ管理、パ フォーマンスチューニング、その他多数の機能をサポートする、Appleの開発ツールスイートです。この開発ツールスイートの 中心にあるのは、基本的なソースコード開発環境を提供する、Xcodeアプリケーション自身です。Xcodeは単なるツールではあ りません。以下のセクションで、iPhoneアプリケーションの作成に使用する際の各種アプリケーションを紹介します。

Xcode 開発作業の中心は、Xcodeアプリケーションです。Xcodeは、iPhoneプロジェクトとソースファイルの作成と管理、実行可能 ファイルへのコードのビルド、iPhone Simulatorまたはデバイス上でのソースコードの実行とデバッグに必要なあらゆるツー ルを備えた統合開発環境(IDE)です。

新しいiPhoneアプリケーションを作成するには、まず、Xcodeでの新規プロジェクトの作成から始めます。1つのプロジェクト で、ソースファイル、ビルド設定、それらの項目をすべてまとめるために必要なルールなど、作成するアプリケーションに関 するすべての情報を管理します。すべてのXcodeプロジェクトの中心にあるのが、図1に示すプロジェクトウインドウです。こ のウインドウから、作成中のアプリケーションの主要な要素すべてに簡単にアクセスできるようになっています。「グループと ファイル」リストでは、各種ソースファイルおよびソースファイルから作成されたビルドターゲットなど、プロジェクト内の ファイルが管理されます。ツールバーはよく使われるツールとコマンドへのアクセス手段を提供し、詳細ウインドウはプロジェ クトでの作業用の設定可能な領域を提供します。プロジェクトウインドウのその他の部分は、プロジェクトについてのコンテ キスト依存の情報を提供します。

-8 -

図1 Xcodeのプロジェクトウインドウ

Xcodeには、コード補完、構文の色分け、(一時的にコードブロックを隠すための)コードの折りたたみ、エラー・警告・メ モを表すインラインの注釈などの機能をサポートする、高度なテキストエディタが含まれています。Xcodeのビルドシステム は、適切なデフォルト設定、および環境を自分の好みに合わせて設定する機能の両方を提供します。また、ドキュメントが必 要な場合は、リサーチアシスタントによってコンテキストに依存したドキュメントが提供され、Xcodeのドキュメントウイン ドウを使って情報の閲覧、検索ができます。

Xcodeでアプリケーションをビルドするときには、iPhone Simulator向けにビルドするか、またはあるデバイス向けにビルド するかを選択できます。iPhone Simulatorは、アプリケーションが基本的に要求どおりに動作するかをテストするためのロー カル環境を提供します。アプリケーションの基本動作に問題がなければ、Xcodeにこれをビルドするよう指定し、コンピュー タに接続したiPhoneまたはiPod touch上で実行できます。デバイス上で実行する場合は基本的なテスト環境が提供さ れ、Xcodeを使ってそのデバイスで実行するコードに組み込みデバッガをアタッチできます。

図2 Xcodeからのプロジェクトの実行 -9 -

iPhone OSでのプロジェクトのビルドと実行の詳細については、『iPhone OS Programming Guide』の「Development Environment」を参照してください。

Interface Builder

Interface Builderは、アプリケーションのユーザインターフェイスを視覚的に組み立てるためのツールです。Interface Builder を使って、構成済みコンポーネントをドラッグ&ドロップ操作することにより、アプリケーションのウインドウの組み立てを 行います。コンポーネントには、スイッチ、テキストフィールド、ボタンなど標準のシステムコントロールと、アプリケーショ ンが提供するビューを表すカスタムビューも含まれています。ウインドウの表面にコンポーネントを配置したあと、ドラッグ 操作によって位置決めを行い、インスペクタを使って属性を設定し、これらのオブジェクトとコードとの間の関係を確立させ ることができます。インターフェイスが望みどおりの外見になったら、コンテンツをnibファイルに保存します。このファイル は、独自のリソースファイル形式です。

Interface Builderで作成するnibファイルには、UIKitが実行時にアプリケーション中に同じオブジェクトを再作成するために 必要なすべての情報が含まれます。nibファイルをロードすると、このファイルに格納されているすべてのオブジェクトの実行 時バージョンが作成され、Interface Builderでの設定とまったく同じように設定されます。また、新たに作成したオブジェク トと、アプリケーション内の既存のオブジェクトとの間の接続を確立するために指定した接続情報も使われます。この接続情 報により、コードにnibファイルオブジェクトへのポインタが与えられるほか、オブジェクト自身がユーザアクションをコード に伝えるために必要な情報も与えられます。

全体的には、Interface Builderを使うことによって、アプリケーションのユーザインターフェイス作成の時間は大幅に節約され ます。Interface Builderにより、インターフェイスを構成するオブジェクトの作成、設定、位置指定に必要なカスタムコードの 量は抑えられます。Interface Builderはビジュアルなエディタであるため、自分のインターフェイスが実行時にどのように表示 されるかを正確に見ることができます。

Instruments 自分のソフトウェアに最高のユーザ体験をもたらすことができるように、Instruments環境では、iPhoneアプリケーションを シミュレータまたはデバイス上で実行しながら、そのパフォーマンスを分析できます。Instrumentsは、実行中のアプリケー ションからデータを収集し、タイムラインと呼ばれるグラフ表示でそのデータを表現します。アプリケーションのメモリ使用 量、ディスクアクティビティ、ネットワークアクティビティ、グラフィックスのパフォーマンスについてのデータを収集できま す。タイムラインビューには、各種の情報がすべて並んで表示されるため、ある特定の領域の動作だけでなく、アプリケーショ ン全体の動作を相関させることができます。さらに詳細な情報を得るには、Instrumentsが収集する詳細なサンプルを表示する こともできます。

- 10 -

図 3 Instrumentsを使ったアプリケーションのチューニング

タイムラインビューのほかに、Instrumentsは時間の経過に伴うアプリケーションの動作の分析に役立つツールを提供します。 たとえば、「Instruments」ウインドウを使って、複数の実行結果からのデータを格納し、アプリケーションの動作が実際に 向上しているか、あるいはまだ作業が必要かを見ることができます。これらの実行結果からのデータをInstruments文書に保存 し、それをいつでも開くことができます。

iPhoneアプリケーションでのInstrumentsの使いかたの詳細については、『iPhone OS Programming Guide』の 「Development Environment」を参照してください。Instrumentsの使いかたの詳細については、『Instruments User Guide』を参照してください。

- 11 -

Objective-Cの学習:入門 Objective-C言語は、高度なオブジェクト指向プログラミングを可能にするために設計された簡単なコンピュータプログラミ ング言語です。Objective-Cは標準ANSI C言語の拡張であり、クラス、メソッド、およびプロパティを定義するための構文 と、クラスの動的拡張を支援する構成体を提供しています。クラスの構文と設計の大部分は、初期のオブジェクト指向言語の1 つであるSmalltalkに基づいています。

オブジェクト指向言語でのプログラミングの経験がある場合は、以下の情報はObjective-Cの基本構文を学習するうえで役立 ちます。カプセル化、継承、ポリモーフィズムなど、従来のオブジェクト指向のコンセプトの多くは、Objective-Cにも存在し ます。いくつか重要な違いはありますが、それらはこの文書で取り上げられており、必要な場合は詳細情報も得られます。

オブジェクト指向言語を使ったプログラミングの経験がない場合は、先に進む前に、関連する概念について少なくとも基本知 識が必要です。オブジェクトとオブジェクト指向構成体の使用は、iPhoneアプリケーションの設計の基礎であり、それらがど のように相互作用するかを理解することはアプリケーションの作成に不可欠です。オブジェクト指向コンセプトの概要につい ては、『Object-Oriented Programming with Objective-C』を参照してください。

Objective-C言語と構文のより詳細な入門書としては、『Objective-C 2.0プログラミング言語』があります。

Objective-C:Cのスーパーセット Objective-Cは、ANSIバージョンのCプログラミング言語のスーパーセットであり、Cと同じ基本構文をサポートしていま す。Cコードと同様に、ヘッダファイルとソースファイルを定義して、パブリックな宣言をコードの実装の詳細部分から切り離 します。Objective-Cのヘッダファイルは、表1に示すファイル拡張子を使用します。

表1 Objective-Cコードのファイル拡張子 拡張子

ソースの種類

.h

ヘッダファイル。ヘッダファイルには、クラス、型、関数、定数の宣言が含まれます。

.m

ソースファイル。これはソースファイルに使われる典型的な拡張子であり、Objective-CとCコードの両 方を含めることができます。

.mm

ソースファイル。この拡張子の付くソースファイルには、Objective-CとCのコード以外に、C++コード を含めることができます。この拡張子は、自分のObjective-Cコードから、C++のクラスや機能を実際 に参照する場合にのみ使用する必要があります。

ソースコードにヘッダファイルをインクルードする必要があるときに、標準の#includeコンパイラディレクティブを使用でき ますが、Objective-Cにはより優れた方法があります。#importディレクティブは、#includeと同じですが、同じファイルが2 回以上はインクルードされないことが保証されています。Objective-Cのサンプルとドキュメントではすべて、#importを使用 しており、読者自身のコードにおいてもそのようにするべきです。 - 12 -

文字列 Objective-Cは、Cのスーパーセットとして、文字列の指定にCと同じ表記をサポートします。つまり、単一の文字は単一引用 符で囲み、複数の文字の並びは二重引用符で囲みます。しかし、ほとんどのObjective-Cのフレームワークでは、Cの形式の文 字列はそれほど頻繁には使用しません。代わりに、ほとんどのフレームワークはNSStringオブジェクトに文字列を渡します。

NSStringクラスは、任意の長さの文字列を格納するためのビルトインメモリ管理、Unicodeのサポート、printf形式の書式設 定ユーティリティなど、期待できる機能のすべてを備えた文字列用のオブジェクトラッパを提供します。ただしこのような文 字列は一般的によく使われるため、Objective-Cは定数値からNSStringオブジェクトを作成するための簡単な表記法を用意し ています。この簡単な表記法を使用するためにしなければならないことは、次の例に示すように、通常の二重引用符で囲まれ た文字列の前に、@記号を付けることです。

NSString* myString = @"My String\n"; NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];

// Cの文字列からObjective-C文字列を作成する NSString* fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

クラス(class) ほかのほとんどのオブジェクト指向言語の場合と同様に、Objective-Cのクラスは、いくつかのデータとそのデータに対して操 作を行うアクションをカプセル化するための基本的な構成体を提供しています。オブジェクトは、あるクラスの単なる実行時 インスタンスであり、そのクラスで宣言されるメンバ変数の固有のインメモリコピーと、クラスのメソッドへのポインタが含ま れています。

Objective-Cでのクラスの指定には、2つの別々の要素が必要です。すなわち、インターフェイスと実装です。インターフェイ ス部分ではクラス宣言を記述し、そのクラスに関連付けられているメンバ変数とメソッドを定義します。実装部分には、クラス のメソッドの実際のコードを記述します。図1に、基本クラスNSObjectから派生したMyClassというクラスを宣言するための 構文を示します。クラス宣言は必ず@interfaceというコンパイラディレクティブから始まり、@endというコンパイラディレク ティブで終了します。クラス名の後には(コンマで区切られて)、親クラスの名前が続きます。クラスのメンバ変数は、中括弧 ({と})で区切られたコードブロック内で宣言されます。メンバ変数ブロックの後には、クラスで宣言されたメソッドのリスト が続きます。セミコロンは、各メンバ変数とメソッド宣言の終わりのマークです。

- 13 -

図1 クラス宣言

図2に、前述の例のMyClassの実装を示します。クラス宣言と同様、クラス実装は2つのコンパイラディレクティブによって識 別されます。ここでは、@implementationと@endです。これらのディレクティブは、囲まれているメソッドと対応するクラ スをコンパイラが関連付けるために必要な、範囲情報となります。したがってメソッドの定義は、コードブロックが含まれる こと以外は、インターフェイスでの対応する宣言と一致します。

- 14 -

図2 クラス実装

注:先述のクラス宣言では、メソッドとクラスしか宣言していませんが、プロパティも宣言できます。プロパティの 詳細については、「プロパティ」を参照してください。

変数にオブジェクトを格納するときには、必ずポインタ型を使います。Objective-Cでは、オブジェクトを含んだ変数に対する 強い型定義と弱い型定義の両方をサポートしています。強く型定義されたポインタには、変数の型宣言にクラス名が含まれま す。弱く型定義されたポインタは、代わりにオブジェクトに対して型idを使います。コレクション内のオブジェクトの正確な型 が不明な場合があるコレクションクラスなどには、弱く型定義されたポインタが頻繁に使われます。強く型定義された言語を 使い慣れている方は、弱く型定義された変数を使うと問題が生じるのではないかと思われるかもしれませんが、弱く型定義さ れた変数は、実際には非常に柔軟性が高く、Objective-Cプログラムのダイナミズムをより高めることができます。

次の例は、MyClassクラスの強く型定義された変数宣言と、弱く型定義された変数宣言を示しています。

MyClass* myObject1; id

myObject2;

// 強い型定義

// 弱い型定義

- 15 -

メソッド(method) Objective-Cのクラスでは、インスタンスメソッドとクラスメソッドの2つのタイプのメソッドを宣言できます。インスタンス メソッドは、実行の範囲がそのクラスの特定のインスタンスであるメソッドです。つまり、インスタンスメソッドを呼び出す 前に、まずクラスのインスタンスを作成する必要があり、そのインスタンスを使って実際のメソッドを呼び出す必要がありま す。これに対して、クラスメソッドではインスタンスを作成する必要はありませんが、詳細については後述します。

メソッドの宣言は、メソッドのタイプ識別子、戻り型、1つまたは複数のシグネチャキーワード、パラメータの型と名前の情報 で構成されます。図3に、insertObject:atIndex:インスタンスメソッドの宣言を示します。宣言の前にはマイナス(-)記号が付い ていますが、これは、これがインスタンスメソッドであることを示しています。メソッドの実際の名前(insertObject:atIndex:) は、コロンも含め、シグネチャキーワードのすべてを結合したものです。コロンは、パラメータの存在を宣言します。メソッド にパラメータがない場合は、最初の(そして唯一の)シグネチャキーワードの後のコロンを省略します。この例では、メソッ ドは2つのパラメータをとります。

図3 メソッド宣言構文

何らかのメソッドを呼び出すときには、対応するオブジェクトに「メッセージ」を送ります。この場合のメッセージは、メッ セージシグネチャと、メソッドに必要なパラメータ情報です。オブジェクトに送るメッセージはすべて動的に配送されます。こ うすることで、Objective-Cクラスのポリモーフィズムの動作を手助けしています。つまり、あるサブクラスにおいてその親ク ラスの1つと同じシグネチャを持つメソッドを定義した場合は、サブクラスはメッセージを受け取ってから、それを親に転送す るか(または転送しないか)を選択できます。

メッセージは大括弧([と])で囲まれます。大括弧の内側では、メッセージを受け取るオブジェクトが左側にあり、メッセージ (およびメッセージに必要な任意のパラメータ)が右側にあります。たとえば、insertObject:atIndex:メッセージをmyArray 変数のオブジェクトに送るには、次の構文を使うことが考えられます。 - 16 -

[myArray insertObject:anObj atIndex:0];

大量のローカル変数を宣言して一時的な結果を格納するのを避けるために、Objective-Cではメッセージをネストできます。ネ ストされた各メッセージの戻り値は、別のメッセージのパラメータまたはターゲットとして使われます。たとえば、先述の例 で使った変数のいずれかを、値を取得するメッセージに置き換えることもできます。たとえば配列オブジェクトとその配列に 挿入するオブジェクトにアクセスするメソッドを持つ、myAppObjectという別のオブジェクトがある場合は、 先述の例を次 のように記述することもできます。

[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];

先述の例ではメッセージをクラスのインスタンスに送信していますが、クラス自身にメッセージを送信することもできます。ク ラスにメッセージを送るときには、指定するメソッドは、インスタンスメソッドではなくクラスメソッドとして定義する必要 があります。クラスメソッドは、C++クラスの静的メンバに相当するもの(ただしまったく同じではない)と考えることがで きます。

通常、クラスメソッドは、クラスの新しいインスタンスを作成したり、クラスに関連する共有情報のいくつかにアクセスしたり するためのファクトリメソッドとして使います。クラスメソッド宣言の構文は、1つの例外を除き、インスタンスメソッドの構 文と同じです。その例外は、メソッドのタイプ識別子にマイナス記号ではなく、プラス(+)記号を使うことです。

次の例は、クラスメソッドを、クラスのファクトリメソッドとして使った例を示しています。この場合、arrayWithCapacity: メソッドは、クラスの新しいインスタンスの割り当てと初期化を行い、それをコードに戻すNSMutableArrayクラスのクラス メソッドです。

NSMutableArray* myArray = nil;

// nilは基本的にはNULLと同じ

// 新しい配列を作成し、それをmyArray変数に割り当てる。 myArray = [NSMutableArray arrayWithCapacity:0];

プロパティ(property) プロパティは、アクセサメソッドに代わって使われる便利な表記法です。プロパティは、クラス宣言内に新しいメンバ変数を作 成しません。プロパティは単に、既存のメンバ変数にアクセスするメソッドを定義するための簡単な表記法です。メンバ変数 を公開するクラスは、getterメソッドとsetterメソッドを使う代わりに、プロパティ表記を使ってこれを行うことができます。 クラスはまた、プロパティを使って「仮想」メンバ変数、すなわち動的に計算され、実際にはメンバ変数には格納されない データをを公開することもできます。

- 17 -

事実上、プロパティによって、記述しなければならない冗長なコードの量は軽減されます。ほとんどのアクセサメソッドは同 様の方法で実装されているため、プロパティを使うことで、クラス内で公開されるメンバ変数ごとに個別にgetterおよびsetter メソッドを提供する必要がなくなります。代わりに、プロパティ宣言を使って必要な動作を指定し、その後、コンパイル時に その宣言に基づいて実際のgetterおよびsetterメソッドを合成します。

プロパティ宣言の結果として実際のメソッドが作成されるため、それらはクラスインターフェイスのメソッド宣言を使ってイン クルードされます。基本的な定義では、@propertyコンパイラディレクティブと、その後に続いてプロパティの型と名前が使 われます。アクセサメソッドの動作を定義するカスタムオプションを使って、プロパティを構成することもできます。次の例 は、シンプルなプロパティ宣言をいくつか示しています。

@property BOOL flag; @property (copy) NSString* nameObject; // 割り当て時にオブジェクトをコピーする。 @property (readonly) UIView* rootView; // getterメソッドのみ作成する。

プロパティのもう1つのメリットは、次の例に示すように、自分のコード内のプロパティにアクセスする際にドット構文を使用 できることです。

myObject.flag = YES; CGRect viewFrame = myObject.rootView.frame;

上記の例で使われているオブジェクト名とプロパティ名はやや不自然ですが、プロパティの柔軟性を示しています。ドット構 文は、対応する一連のメソッド呼び出しを実際にマスクします。読み取り可能プロパティの背後にはそれぞれ、プロパティと 同じ名前のメソッドがあります。書き込み可能プロパティの背後にはそれぞれ、setPropertyName:(プロパティ名の1文字目 は大文字表記)の形式の追加メソッドがあります(これらのメソッドがプロパティの実際の実装であり、それが背後にメンバ 変数がないクラスの属性のプロパティ宣言をインクルードできる理由です)。プロパティの代わりにメソッドを使って上記の コードを実装すると、次のような記述になります。

[myObject setFlag:YES]; CGRect viewFrame = [[myObject rootView] frame];

クラスにおけるプロパティの宣言方法の詳細については、『Objective-C 2.0プログラミング言語』の「プロパティ」を参照し てください。

プロトコル(protocol)と委任(delegate)

- 18 -

プロトコルは、すべてのクラスが実装できるメソッドを宣言します。プロトコルはクラス自身ではありません。プロトコルは 単に、ほかのオブジェクトが実装に関与するインターフェイスを定義します。クラスの1つにおいて、あるプロトコルのメソッ ドを実装している場合、そのクラスは当該プロトコルに適合しているといいます。

iPhone OSでは、委任オブジェクトの実装にプロトコルを頻繁に使います。委任は、別のオブジェクトに代わって、またはそれ と連携して機能するオブジェクトです。プロトコル、委任、その他のオブジェクトの間の相互作用を調べる最も良い方法は、 例を見ることです。

UIApplicationクラスは、アプリケーションの必須の動作を実装しています。UIApplicationを強制的にサブクラス化させてア プリケーションの現在の状態に関する簡単な通知を受け取るのではなく、指定された委任オブジェクトの特定のメソッドを呼 び出すことにより、UIApplicationクラスはこれらの通知を送信します。UIApplicationDelegateプロトコルのメソッドを実装 しているオブジェクトが、これらの通知を受け取り、適切なレスポンスを提供することができます。

プロトコルの宣言はクラスインターフェイスの宣言に似ていますが、親クラスを持たない点と、メンバ変数を定義しない点が異 なります。次の例は、単一のメソッドを持つシンプルなプロトコル宣言を示しています。

@protocol MyProtocol - (void)myProtocolMethod; @end

多くの委任プロトコルの場合、プロトコルの採用は、そのプロトコルによって定義されるメソッドを単に実装することです。 プロトコルをサポートしていることを明示的に指定する必要があるプロトコルもいくつかありますが、ここではメソッドの実 装で十分であると想定してかまいません。しかし開発に深く関わるにつれ、『Objective-C 2.0プログラミング言語』の「プロ トコル」を参照することにより、プロトコルについてとそれらがどのように使われるかの学習により多くの時間を費やす必要 があります。

詳細情報 これまでの情報は主に、Objective-C言語の基礎に慣れてもらうことを意図しています。ここで取り上げたテーマは、残りの文 書を読み進める中で直面する可能性が高い言語機能を反映しています。ただし、これらがこの言語の機能のすべてではなく、 『Objective-C 2.0プログラミング言語』でこの言語についての詳細を読むことをお勧めします。

- 19 -

iPhone開発におけるSigning Code Code Signingは、コードが改変されていない事を確かなものとし、コードの作成者を確実に識別する事ができます。全ての iPhoneアプリケーションは、開発システムで実行する、あるいは配布のためにAppleにサブミットする前に、デジタル的に Signされている必要があります。さらに配布前にAppleはAppleのDigital Signatureをそれぞれのアプリケーションに付加しま す。

デジタル署名と識別情報(Digital SignatureとSigning Identities) 全てのiPhoneアプリケーションは、Appleが登録iPhoneデベロッパ向けに発行したCertificateにより、デジタル的に署名 (Sign)されている必要があります。このSignatureは、アプリケーションの開発者の識別と、アプリケーションが署名された以 降に改変されていない事を証明します。 デジタル署名には、Public KeyとPrivate Keyとして知られる、2つの暗号

が必要です。Private Keyは署名のプロセスで使わ

れ、Public Keyは署名の確認に使われます。Public Keyは署名された証明書(Signing Certificate)に格納され、Private Keyは別 に保管されます。この Certificate と関連するPrivate Keyの組み合わせは、デジタル識別(Digital IdentityまたはSigning Identity)と呼ばれます。 iPhone開発のためのSigning Identityを入手するには、Keychain Access UtilityのCertificate Assistantを使って、Certificate Signing Request (CSR)を作成し、iPhone Developer ProgramのProgram Portalから送付して下さい。リクエストが許可され たらCertificate Fileをダウンロードし、ダブルクリックであなたのKeychainにインストールします。これは、Certificate Assistant UtilityでCSRを生成する手順で、Public KeyとPrivate Keyのペアを自動的に作成し、Public KeyはAppleに送る Certificate Requestに、Private KeyをあなたのKeychainに格納しています。 Signing Certificateをダウンロードしインストールすると、Keychain Access UtilityはそれをPrivate Keyと関連付け て、Signing Identityを作成します。Private Keyに関連づけられたCertificateの一覧は、Keychain Access Utilityを開 き、CategoryパネルでMy Certificatesを選ぶと表示されます。

署名されたアプリケーションを登録した(Provisioned)デバイスにインストールすると、iPhone OSはSignatureを読んで、その アプリケーションがあなたによって署名され、それ以後改変されていない事を確認します。Signatureが有効(Valid)でないか、 コードがあなたによって署名されていない場合、iPhone OSはアプリケーションを実行しません。 - 20 -

同様に、アプリケーションを配布のためにAppleに送付する場合、あなたのSigning Identityを使って署名したアプリケーショ ンと共に、Signing Certificateも送って下さい。(Private Keyを送付する必要はありません。) Appleは、そのSignatureによっ て、コードが確かに登録デベロッパー(あなた)から送られて来た事と、途中で改変されていない事を確認します。最後にApple はAppleのSigning Certificateであなたのアプリケーションに署名します。この時点であなたのアプリケーションはあなたの開 発デバイス以外のiPhoneとiPod Touchで実行する事が可能となります。これらの方針により、デバイスの所有者は、iTunesか らダウンロードしたアプリケーションは確かに登録デベロッパーにより書かれた物であり、作成した後改変されていないた め、安全であると確信出来ます。

他のコンピュータにSigning Identityをコピーする 開発作業に複数のコンピュータが必要となった場合(例えば会社でデスクトップ、家でラップトップ等)、あなたのSigning Identityが両方のコンピュータで必要となります。あなたがProgram PortalからダウンロードしたSining Certificateファイル にはPrivate Keyが含まれていないため、単純にこのファイルを他のコンピュータにコピーしても、十分ではありませ ん。Keychain AccessのFileメニューからExport Itemsを使って、CertificateとPrivate Keyを、Personal Information Exchange ファイル (.p12) に書き出し、他のコンピュータにコピーして下さい。そのファイルをダブルクリックし て、CertificateとKeyをKeychainにインストールします。

Private Keyの保管は安全に このシステムは、あなたのSigning Identity - 特にPrivate Key - をセキュアに保つ限り、非常に安全です。もし誰かがあなた のSigning IdentityとPrivate Keyにアクセスすると、彼はあなたのアプリケーションを変更したり、別のアプリケーションを あなたが作成したものとする事が出来ます。よってあなたソフトウェアとIdentityの悪意ある使用を避けるには、Private Key の物理的なセキュリティーが不可欠です。 Signing Identityの請求とコードの署名の行程の前に、あなたの会社の誰がIdentityのプロセスを実行し、誰が利用可能で、ど のように安全に保管するのか、限定する必要があります。例えば、Identityを複数の人が利用する必要があるのなら、安全な一 台のコンピュータのKeychainにのみ保管し、Keychainのパスワードは権限を持つ人のみに伝える、またはIdentityを権限を持 つ人のみがPINを持つSmart Cardに保管する等の方法があります。 デフォルトではKeychainのパスワードはログインパスワードと同じで、そのコンピュータにあなたがログインしている間、 ずっとロックが解除された状態となります。これは裏口のそばのテーブルに車のキーを放置し、裏口の鍵を一日中開けておく のと同じです。車泥棒から車を守るには、車をスタートするのに必要なキーを安全に保管する必要があるのです。 Keychainに格納されたSigning Identityや他の価値ある秘密を守るには、少なくとも以下の事を実行すべきです。 Keychainを使用しない時はロックしておく。Keychain Access UtilityのEdit > Change Settings for Keychainを選 び、Lockのチェックボックスをチェックします。 Keychainとログインパスワードを異なった物にする。Keychain Access UtilityのEdit > Change PasswordでKeychainのパ スワードを変更します。Password変更ダイアログの鍵アイコンをクリックしてPassword Assistantを呼び出すと、あなたの パスワードがどのくらい安全か、あるいは適当なパスワードの提案を受ける事ができます。暗記出来る物を選び、どこにも書 き残してはなりません。 加えて、コンピュータの物理的な安全を確保し、権限の無い人のアクセスを遮断して下さい。 他の重要なデータと共にSigning Identityのバックアップを作成し、安全な場所に保管しましょう。他の安全なコンピュータの Keychainに保管する事もできますし、暗号化したCDやディスクイメージにPersonal Information Exchange (.p12) ファイル 形式で保管する事もできます。全てのパスワードに強固な物を設定し、この目的のために使用する全てのコンピュータを物理 的にセキュアな状態に保ち、アクセスを信頼出来る限られた方に限定します。

- 21 -

どこからスタートするか Signing Identityの請求とインストールの手順はiPhone Developer ProgramウェブサイトのProgram Portalに詳細がありま す。iPhone DevCenterの右上にあるProgram Portalアイコンをクリックして下さい(このリンクをアクティブにするにはログ インしている必要があります)。説明が英語なため、Keychain Accessは英語モードでお使い頂く事をお勧めします。 Digital Signature、Encryption Keys、Certificateに関する詳細は、「Security Overview」と「Code Signing Guide」を 参照して下さい。

- 22 -

iPhoneアプリケーションの作成 上位のレベルでは、iPhoneアプリケーションを作成するプロセスはMac OS Xアプリケーションを作成するプロセスに似てい ます。どちらも同じツールを使用し、基本ライブラリの多くも同じです。しかし、この類似性にかかわらず、大きな違いもあり ます。iPhoneはデスクトップコンピュータではなく、使用目的も異なり、設計に当たっては大きく異なるアプローチが必要で す。そのアプローチでは、iPhone OSの強みを活かす必要があるとともに、モバイル環境において重要でない、あるいは実用的 でないと考えられる機能を見送る必要があります。iPhoneおよびiPod touchの画面が小さいということは、アプリケーション のユーザインターフェイスをよく整理して、ユーザが一番必要としている情報を常に中心にすることを意味します。

iPhone OSでは、デスクトップアプリケーションではできな い方法でiPhoneおよびiPod touchの各デバイスをインタラ クティブに操作できます。Multi-Touchインターフェイス は、イベントを受け取るための革新的な新しい方法であ り、画面への接触を指ごとに報告することで、複数の指に よるジェスチャやその他の複雑な入力が簡単に行えます。 加えて、一部のデスクトップシステムにも存在する加速度 計などの組み込みのハードウェア機能は、iPhone OSでは 画面の現在の向きを検出してコンテンツをそれに合わせて 調整するために広く用いられます。これらの機能をアプリ ケーションの中でどのように使用できるかを理解すれば、 ユーザにとって適切な設計に専念するのに役立ちます。

iPhoneアプリケーションの設計を理解する最善の方法は、 例を見ることです。この記事では、MoveMeサンプルアプ リケーションを紹介します。このサンプルは、以下を含む iPhoneアプリケーションの典型的な動作の多くを示しま す。



アプリケーションの初期化



ウインドウの表示



独自コンテンツの描画



タッチイベントの処理



アニメーションの実行

- 23 -

図1は、このアプリケーションのインターフェイスを示します。「Welcome」ボタンをタッチすると、アニメーションが開始 され、ボタンが脈動すると同時に、指の下にボタンの中心が移動します。画面上で指をドラッグすると、ボタンが指の動きに 追随します。画面から指を離すと、ボタンが元の位置に引き戻される様子が別のアニメーションを使用して表示されます。ボ タン外の任意の場所をダブルタップすると、ボタンに表示されている言葉が変わります。

この記事の他の項を読み進める前に、ソースコードを直接なぞれるように、サンプル(MoveMe)をダウンロードすることをお勧 めします。また、あらかじめiPhone Dev Centerの以下の入門ページに目を通して、iPhone OS、および開発に使用するツール と言語の基本を理解しておくことをお勧めします。



iPhone OSの概要



iPhone開発用ツール

Objective-Cプログラミング言語をあまりよく知らない場合は、「Objective-Cの学習:入門」にあらかじめ目を通し て、Objective-Cの基本的な構文を把握しておきましょう。

MoveMeサンプルプロジェクトの確認 MoveMeサンプルをダウンロードすると、アプリケーションのビルドと実行に必要なソースコードとサポートファイルを入手で きます。iPhone OS向けのプロジェクトは、Xcodeアプリケーション(デフォルトでは、/Developer/Applicationsにありま す)を使用して管理します。Xcodeの各プロジェクトウインドウは、コードとリソースファイル、ソースをコンパイルしてアプ リケーションを組み立てるためのビルドルール、およびコードの編集とデバッグを行うためのツールを集約する作業領域を組 み合わせたものです。

図2に、MoveMeアプリケーションのXcodeプロジェクトウインドウを示します。このプロジェクトを開くには、ローカルの ハードディスクにコピーしてからMoveMe.xcodeprojファイルをダブルクリックして開きます(「ファイル」>「開く」を選 択してファイルを選ぶことで、プロジェクトをXcodeの中で開くこともできます)。プロジェクトには、Objective-Cで書かれ たいくつかのソースファイル(拡張子.mによって示されます)、いくつかの画像ファイルとリソース、およびアプリケーショ ンバンドルをビルドするための事前定義されているターゲット(MoveMe)が含まれています。

- 24 -

図2 MoveMeプロジェクトウインドウ

iPhone OSでは、Xcodeプロジェクトの最終的なターゲットはアプリケーションバンドルです。アプリケーションバンドルは、 アプリケーションのバイナリ実行可能ファイルおよび関係するリソースファイルを収めた特別な種類のディレクトリで す。iPhone OSにおけるバンドルは、比較的フラットなディレクトリ構造をもち、ほとんどのファイルはバンドルディレクトリ の最上位レベルにあります。しかし、バンドルは、ローカライズされた文字列や言語固有のその他のリソースファイルを格納 するサブディレクトリをもつこともできます。この記事においては、アプリケーションバンドルの正確な構造を知っている必要 はありませんが、この情報に興味がある場合は、『iPhone OS Programming Guide』の「The Application Bundle」を参照 してください。

MoveMeアプリケーションのビルド MoveMeアプリケーションをビルドしてシミュレータの中で実行するには、次の手順を実行します。

1.

Xcode内でMoveMe.xcodeprojファイルを開きます。

2.

プロジェクトツールバーの「Active SDK」メニューの中でシミュレータのオプションが選択されていることを確認し ます。

3.

メニューから「ビルド」>「ビルドして進行」を選択するか、ツールバーの「ビルドして進行」ボタンをクリックし ます。

アプリケーションのビルドが終了すると、XcodeによってアプリケーションがiPhone Simulatorにロードされ、開始されま す。マウスを使用して「Welcome」ボタンをクリックし、ボタンを画面内でドラッグしてアプリケーションの振る舞いを確認 できます。開発用に機器を設定してあれば、アプリケーションをビルドしてその機器で実行することもできます。開発用の機器 - 25 -

を設定しアプリケーションをロードする方法の詳細については、『iPhone OS Programming Guide』の「Development Environment」を参照してください。

メモリ管理について iPhone OSは、基本的にオブジェクト指向のシステムです。したがって、割り当てるメモリの大半はObjective-Cオブジェクト として割り当てます。iPhone OS内のオブジェクトは、オブジェクトが占有しているメモリ領域を安全に解放するタイミングを 知るために、参照数をカウントするという方式を採用しています。オブジェクトを最初に作成したとき、その参照カウントは1 から始まります。そのオブジェクトを受け取るクライアントは、オブジェクトを保持することを選べ、その場合にはその参照 カウントが1増えます。クライアントは、オブジェクトを保持した場合、不要になったときにはそれを必ず解放しなければなり ません。オブジェクトを解放すると、その参照カウントは1減ります。オブジェクトの参照カウントが0になると、そのオブ ジェクトのメモリ領域がシステムによって回収されます。

注:iPhone OSは、Mac OS X v10.5以降にあるガベージコレクション機能を使用したメモリ管理はサポートしませ ん。

汎用のメモリブロック(つまり、オブジェクトに関連付けられていないメモリ)を割り当てたい場合には、標準のmallocライ ブラリの呼び出しを使用して割り当てができます。ほかの任意のメモリ割り当てと同様に、mallocを使用して割り当てを行い ます。また、不要になったらfree関数を呼び出して解放する必要があります。mallocを使用したメモリブロックは、システム によって解放されることはありません。

メモリをどのような方法で割り当てるかにかかわらず、iPhone OSにおけるメモリ使用の総合的な管理は、Mac OS Xの場合よ りも重要です。iPhone OSには、仮想メモリシステムがありますが、スワップファイルは使用しません。つまり、コードのペー ジは必要に応じてフラッシュできますが、アプリケーションのデータは全部が一度にメモリに入らなければなりません。シス テムは、空きメモリの総量を監視し、アプリケーションが必要とするメモリが利用できるように可能な限りのことをします。 しかし、メモリの使用が限界に達すると、システムはアプリケーションを終了することがあります。ただし、この選択肢は、 電話を受けるなどの重要な処理を行うのに必要なメモリを、システムが確保するための最後の手段としてのみ実行されます。

iPhone OSにおいてオブジェクトの割り当てを行う方法の詳細については、『Cocoa基礎ガイド』を参照してください。アプリ ケーションのメモリ使用効率を向上する方法の詳細およびヒントについては、『iPhone OS Programming Guide』の 「Managing Your Memory Usage」を参照してください。

MoveMeアプリケーションの初期化 ほかのC言語ベースのアプリケーションと同様に、すべてのiPhoneアプリケーションのエントリポイントは、mainという名前 の関数です。幸いなことに、XcodeのなかでiPhoneのテンプレートを使用して新規プロジェクトを作成するときは、自分でこ の関数を書く必要がありません。プロジェクトのテンプレートには、この関数が用意されており、アプリケーションの開始に 必要なコードがすべて含まれています。

- 26 -

リスト1に、MoveMeアプリケーションのmain関数を示します。main関数は、プロジェクトのmain.mファイルに含まれていま す。作成するアプリケーションはすべて、このmain関数とほとんど同じmain関数が含まれることになります。この関数は、重 要な作業を2つ行います。1つは、アプリケーションの最上位レベルの自動解放プールを作成します。このプールの仕事 は、autoreleaseメソッドによって解放されたObjective-Cオブジェクトのメモリを回収することです。もう1つ は、UIApplicationMain関数を呼び出してMoveMeアプリケーションの主要なオブジェクトを作成し、それらのオブジェクト を初期化し、イベント処理ループを開始することです。アプリケーションは、終了するまでこの関数からは戻りません。

int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"MoveMeAppDelegate"); [pool release]; return retVal; } リスト1 用意されているmain関数を使用する

自分独自のプロジェクトにおいて、main関数の中で注目を必要とする箇所があるとすれば、アプリケーション委任オブジェク ト (delegate) の名前です。この名前は、プロジェクトの中で用意するクラスの名前に対応します。アプリケーション委任オブ ジェクトは、アプリケーションの変化する状況に反応するために標準のUIApplicationオブジェクトと連携して動作します。ア プリケーションオブジェクトが動作の大部分を担いますが、委任オブジェクトは以下を含むいくつかの重要な動作を担いま す。



アプリケーションのウインドウおよび当初のユーザインターフェイスの作成



自分独自のデータエンジンに必要な追加の初期化作業の実行



アプリケーション独自のURLスキームに対応するコンテンツのオープン



デバイスの向きの変化に対する反応



メモリ不足警告の処理



アプリケーション終了システムリクエストの処理

起動時に委任オブジェクトがすぐに取り掛からなければならないのは、アプリケーションウインドウの作成とその表示です。 これについては、「アプリケーションウインドウの作成」で説明します。委任オブジェクトはまた、アプリケーションの以前 の状態を復元したり必要なオブジェクトを作成したりするなど、アプリケーションをすぐに使えるようにするための準備に必 要な作業もすべて実行しなければなりません。アプリケーションの終了時には、委任オブジェクトはアプリケーションを秩序 正しく停止し、次回起動するときに必要となる状態情報を保存しておく必要があります。

iPhoneアプリケーションの基礎的なアーキテクチャおよびライフサイクルの詳細については、『iPhone OS Programming Guide』の「Core Application Architecture」を参照してください。

- 27 -

アプリケーションウインドウの作成 アプリケーションはすべて画面全体を覆うウインドウを作成し、そのウインドウをコンテンツで埋めなければなりませ ん。iPhone OSで動作するグラフィカルなアプリケーションは、他のアプリケーションと同時には動作しません。実際、アプ リケーションを起動すると、カーネルおよび下位レベルのいくつかのデーモンを除けば、動作しているのはそのアプリケー ションだけです。そのうえ、アプリケーションが必要とするウインドウ(UIWindowクラスのインスタンス)は1つだけでなけ ればなりません。ユーザインターフェイスを変える必要がある場合には、ウインドウに表示されるビューを切り替えます。

ウインドウは、ユーザインターフェイスの描画対象を提供するのに対し、ビューオブジェクトは実際のコンテンツを提供しま す。ビューオブジェクトは、UIViewクラスのインスタンスであり、何らかのコンテンツを描画すると共に、そのコンテンツに 対するインタラクティブな操作に反応します。iPhone OSでは、テーブル、ボタン、テキストフィールド、その他の種類のイン タラクティブコントロールなどを表す標準ビューが定義されています。ウインドウにこれらの任意のビューをウインドウに追 加したり、UIViewをサブクラス化して独自に描画コードおよびイベント処理コードを実装して独自のビューを定義したりでき ます。MoveMeアプリケーションではそのようなビューが2つ定義されています。それぞれMyViewクラスおよびPlacardView クラスとして表され、アプリケーションのインターフェイスを表示すると共にユーザによるインタラクティブな操作に対応しま す。

ビジュアルなツールであるInterface Builderを使用して、ウインドウ内のビューの作成と配置、ビュー階層の設定、各ビュー のオプションの設定、およびビューとアプリケーションの他のオブジェクトとの関係の確立が可能です。ビジュアルなツール であるため、これらの作業はすべてコンポーネントをウインドウ内でドラッグすることで行います。結果として、即座に表示 し、すぐに変更を加えることのできるインタラクティブなインターフェイスが得られます。 起動時の目標は、アプリケーションウインドウを作成し、可能な限り早く最初のコンテンツをいくらか表示することです。ウ インドウの作成は、アプリケーション委任オブジェクトの仕事です。アプリケーションが起動してイベントの処理を開始でき る状態になると、UIApplicationオブジェクトによって委任オブジェクトに対してapplicationDidFinishLaunching:メッセージ が送信されます。このメッセージは、委任オブジェクトにとって、ウインドウを作成してアプリケーションに必要なその他の 初期化を行う合図となります。

MoveMeアプリケーションにおいては、委任オブジェクトのapplicationDidFinishLaunching:メソッドが次のことをします。

1.

枠のサイズが画面の範囲と一致する新しいUIWindowオブジェクトを作成します。

2.

背景ビューとして動作しウインドウ枠全体を埋めるMyViewクラスの新しいインスタンスを作成します。

3.

「Welcome」ボタンとして動作するPlacardViewクラスの新しいインスタンスを作成します。このビューを背景 ビューの中央に位置付けます。

4.

ウインドウを表示します。

リスト2に、MoveMeアプリケーションのapplicationDidFinishLaunching:メソッドを示します。このメソッドは、UIScreen クラスから画面の範囲を取得し、それを新しいUIWindowオブジェクトの作成と初期化に使用します。アプリケーション委任 オブジェクトは、それを自身のwindowメンバ変数に格納します。その後、委任オブジェクトはウインドウの主要なコンテンツ - 28 -

のビューを作成し、ウインドウを可視にします。ウインドウを表示することで、システムに対しアプリケーションがイベント処 理の準備が整ったことが知らされます。

- (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// 画面全体を覆うようにコンテンツビューを設定する contentView = [[MyView alloc] initWithFrame:[window bounds]];

// ウインドウを設定して表示する [window addSubview:contentView]; [window makeKeyAndVisible]; } リスト2 アプリケーションウインドウの作成

注: applicationDidFinishLaunching:メソッドを使用して、アプリケーションのユーザインターフェイスを作成する だけでなく、ほかの作業も行えます。多くのアプリケーションでは、このメソッドを使用して必要なデータ構造体を 初期化したり、ユーザの初期設定を読み取ったり、アプリケーションが前回終了したときの状態を復元したりしま す。

前述のコードでは、ウインドウを作成し、背景ビューを作成してからウインドウを表示していますが、「Welcome」ボタンを 表示するPlacardViewクラスを作成するコードが見当たりません。その動作は、リスト3に示すMyViewクラスの initWithFrame:メソッドによって処理されます。このビューの初期化には、PlacardViewオブジェクトの作成も含まれま す。MyViewクラスは、アプリケーション全体の背景を提供するので、PlacardViewオブジェクトをサブビューとして追加しま す。この2つのビューの関係によって、アプリケーションの背景の手前に「Welcome」ボタンが表示されるだけでなく、ボタ ンを対象としたイベントをMyViewクラスが処理できるようにもします。

- 29 -

- initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) {

self.backgroundColor = [UIColor darkGrayColor];

// placardビューを作成する -- それ自身の枠をその画像に基づいて算出する placardView = [[PlacardView alloc] init]; placardView.center = self.center; [self addSubview:placardView]; } return self; } リスト3 コンテンツビューの初期化

ウインドウとビューの作成の詳細については、『iPhone OS Programming Guide』の「Windows and Views」を参照してく ださい。

「Welcome」ボタンの描画 UIKitによって提供される標準のビューは、変更を加えなくても、さまざまな簡単なコンテンツを描画するのに使用できます。 たとえば、UIImageViewクラスを使用して画像を表示したり、UILabelクラスを使用してテキスト文字列を表示したりできま す。MoveMeアプリケーションのMyViewクラスはまた、すべてのビューの基本プロパティ(具体的には、backgroundColor プロパティ)を利用して、ビューを無地の色で埋めます。MyViewクラスによって無地の背景色が表示されるので、このプロパ ティを設定するだけでほかの描画コードを書く必要がなくなります。しかし、コンテンツを動的に描画する必要がある場合に は、UIKitに含まれる高度な描画機能や、QuartzまたはOpenGL ESを使用する必要があります。

MoveMeアプリケーションのPlacardViewクラスは、「Welcome」ボタンを描画し、画面上での位置を管理しま す。PlacardViewクラスでは、組み込みのUIImageViewオブジェクトおよびUILabelオブジェクトを使用してコンテンツを描 画することもできますが、ここでは全体の処理を示すためにコンテンツを明示的に描画することにしました。その結果、この クラスではdrawRect:メソッドを実装しています。このメソッドで、ビューのカスタム描画が行われます。

ビューのdrawRect:メソッドが呼び出されるころには、描画の環境は設定され、処理の準備が整います。後は、任意のカスタ ムコンテンツを描画する描画コマンドを指定するだけです。PlacardViewクラスにおいては、コンテンツは背景画像 (Placard.pngリソースファイルに格納されています)および動的に変更が可能なテキストであるカスタム文字列で構成されま す。このコンテンツを描画するために、クラスは次の手順を実行します。 - 30 -

1.

ビューの現在の原点に背景画像を描画します(ビューは、画像が入るようにサイズが設定されているので、この手順 によってボタン全体の背景が提供されます)。

2.

「Welcome」文字列がボタンの中央に表示されるように位置を計算します(文字列の長さは変わるので、その位置 は、その時点の文字列のサイズに基づいてその都度計算する必要があります)。

3.

描画色を黒に設定します。

4.

文字列を黒色で描画し、少し位置をずらします。

5.

描画色を白に設定します。

6.

目的の位置に文字列を再度描画します。

リスト4に、PlacardViewクラスのdrawRect:メソッドを示します。placardImageメンバ関数には、ボタンの背景となる UIImageオブジェクトが含まれており、currentDisplayStringメンバ変数は、「Welcome」文字列を含んだNSStringオブ ジェクトです。画像の描画後、このメソッドはビュー内での文字列の位置を計算します。文字列のサイズはすでにわかってい ます。文字列を読み込んでtextSizeメンバ変数に格納するときに計算しているからです。その後文字列を、NSStringの drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:メソッドを使用して黒で1回、白でもう1 回、合計2回描画しています。

- 31 -

- (void)drawRect:(CGRect)rect { // placardを座標 0,0 に描画する [placardImage drawAtPoint:(CGPointMake(0.0, 0.0))];

/* 現在の表示文字列を描画する。 これは、UILabelを使用してもできるが、ここではNSStringに対するUIKit拡張を紹介することを目的としている。 テキストをビューの中央に2回描画する。最初に位置を少しずらして黒で、続いて白で行う。これは、浮いているよ うに見せるためである。フォントとテキストのサイズはsetupNextDisplayStringの中で計算している。 */

// ビューの中央に表示されるように文字列を描画する位置を計算する CGFloat x = self.bounds.size.width/2 - textSize.width/2; CGFloat y = self.bounds.size.height/2 - textSize.height/2; CGPoint point;

// 適切なサイズのフォントを取得する UIFont *font = [UIFont systemFontOfSize:fontSize]; [[UIColor blackColor] set]; point = CGPointMake(x, y + 0.5); [currentDisplayString drawAtPoint:point forWidth:(self.bounds.size.width-STRING_INDENT) withFont:font fontSize:fontSize lineBreakMode:UILineBreakModeMiddleTruncation baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; [[UIColor whiteColor] set]; point = CGPointMake(x, y); [currentDisplayString drawAtPoint:point forWidth:(self.bounds.size.width-STRING_INDENT) withFont:font fontSize:fontSize lineBreakMode:UILineBreakModeMiddleTruncation baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; } リスト4 「Welcome」ボタンの描画

- 32 -

画像や文字列よりも複雑なコンテンツを描画する必要がある場合は、QuartzまたはOpenGL ESが使用できます。Quartz は、UIKitと連携してベクトルパス、画像、グラデーション、PDF、その他の動的に作成した複雑なコンテンツの描画を処理し ます。QuartzとUIKitは同じ描画環境をベースにしているため、ビューのdrawRect:メソッドからQuartz関数を直接呼び出した り、UIKitの各クラスを使用する際にQuartzの呼び出しをいろいろと組み合わせて使用できます。

OpenGL ESを、QuartzとUIKitの代わりに利用できます。Mac OS X用のOpen GLの関数と似た関数(同じではありません)の セットを使用して2Dや3Dのコンテンツのレンダリングができます。QuartzとUIKitとは異なり、描画にはビューのdrawRect: メソッドを使用しません。依然としてビューは使用しますが、ビューのオブジェクトは主にOpenGL ESコードが描画を行う対 象を提供するために使用します。描画対象を更新する頻度および更新をするために使用するオブジェクトは、開発者が決めら れます。

それぞれの描画技術およびその使用方法の詳細については、『iPhone OS Programming Guide』の「Graphics and Drawing」を参照してください。

タッチイベントの処理 iPhone OSのMulti-Touchインターフェイスにより、アプリケーションは複数の指がデバイスに触れることで生成される個別の イベントを検出して応答することが可能になります。複数の指に対応できる能力は、大きな力を与えますが、従来のマウスベー スのイベント処理システムにおける方法から大きく離脱することになります。それぞれの指がデバイスの表面をタッチするたび に、タッチセンサによって新しいタッチイベントが生成されます。それぞれの指が動くと、指の新しい位置を示す新しいタッ チイベントが生成されます。デバイス表面から指が離れると、そのことを示すまた別のタッチイベントがシステムによって送ら れます。

一度に複数の指がデバイスに触れている可能性があるので、それらのイベントを使用してユーザによる複雑なジェスチャを識別 することも可能です。システムは、スワイプのような一般的なジェスチャの検出をいくらか支援しますが、それよりも複雑な ジェスチャの検出は開発者が責任を負います。システムによって生成された新しいタッチイベントには、デバイスの表面に触れ ているそれぞれの指または離れたばかりの指に関する情報が含まれます。各イベントオブジェクトには、その時点で有効なす べてのタッチに関する情報が含まれているため、新しいイベントの到着のたびに、それぞれの指のアクションを監視できま す。そして、各指の動きをイベントからイベントへ追跡してジェスチャを検出し、それをアプリケーションのコンテンツに対し て適用できます。たとえば、ユーザがピンチクローズまたはピンチオープンのジェスチャを行っていることを示すイベントがあ り(図3に示します)、基盤のビューで拡大縮小をサポートしている場合、これらのイベントを使用して現在の拡大縮小レベル を変更できます。

- 33 -

図3 タッチイベントを使用したジェスチャの検出

システムは、アプリケーションのレスポンダオブジェクト(UIResponderクラスのインスタンス)にイベントを送信しま す。iPhoneアプリケーションでは、アプリケーションのビューがカスタムレスポンダオブジェクトの大部分を構成しま す。MoveMeアプリケーションでは2つのビュークラスを実装していますが、実際にイベントメッセージに応答するのは MyViewクラスだけです。このクラスは、UIResponderのメソッドをオーバーライドすることで、「Welcome」ボタンの境界 の内側と外側の両方でタップを検出します。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; MoveMeアプリケーションでは、イベント処理の動作を簡単にするために、デバイスの表面をタッチした最初の指だけを追跡 します。これは、Multi-Touchイベントをデフォルトで無効にするUIViewクラスの支援を受けて実現します。複数の指を追跡 する必要のないアプリケーションでは、この機能は非常に便利です。Multi-Touchイベントが無効になっていると、デバイス にタッチした最初の指に関連するイベントだけがシステムによって送信されます。連続する新しいタッチに関連するイベント は、ビューには決して送信されません。それらの新しいタッチに関する情報が必要な場合は、UIViewクラスの setMultipleTouchEnabled:メソッドを使用してマルチタッチのサポートを再び有効にできます。

イベント処理動作の一環として、MyViewクラスは次の手順を実行します。

1.

タッチが最初に到着したとき、イベントがどこで生じたかを調べます。



「Welcome」ボタンの外側のダブルタップは、ボタンに表示される文字列を更新します。



ボタンの内側のタップは、ボタンの中心が指の下に来るようにボタンを移動し、ボタンを拡大する最初のア ニメーションを起動します。



他のタッチはすべて無視されます。 - 34 -

2.

指が移動しそれがボタンの内側にある場合、指の新しい位置に合わせてボタンの位置を更新します。

3.

指がボタンの内側にあって、そこからデバイスの表面を離れた場合、ボタンが最初の位置に戻るアニメーションが表 示されます。

リスト5に、MyViewクラスのtouchesBegan:withEvent:メソッドを示します。このメソッドは、指で最初にデバイスにタッチ したときにシステムによって呼び出されます。メソッドでは、すべてのタッチのセットを取得し、そこからただ1つのオブジェ クトを取り出しています。UITouchオブジェクト内の情報に基づいて、タッチが発生したビュー(MyViewオブジェクトまたは PlacardViewオブジェクト)と、そのタッチに対応するタップの回数を識別しています。タッチがボタンの外側で生じたダブ ルタップの場合、touchesBegan:withEvent:メソッドからsetupNextDisplayStringを呼び出してボタンの「Welcome」文字 列を変更します。イベントが「Welcome」ボタンの内側で発生した場合、animateFirstTouchAtPoint:メソッドによってボタ ンを拡大し、タッチのあった位置まで移動します。タッチに関係する他のイベントはすべて無視されます。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // タッチを1つだけサポートすることとしたので、allTouchesから該当するタッチを取得する UITouch *touch = [[event allTouches] anyObject];

// タッチがplacardビューの内側で生じた場合にのみplacardビューを移動する if ([touch view] != placardView) { // placardビューの外側でダブルタップが生じた場合は、placardの表示文字列を更新する if ([touch tapCount] == 2) { [placardView setupNextDisplayString]; } return; } // 最初のタッチのアニメーションを実行する CGPoint touchPoint = [self convertPoint:[touch locationInView] fromView:placardView]; [self animateFirstTouchAtPoint:touchPoint]; } リスト5 最初のタッチイベントの処理

リスト6に、MyViewクラスのtouchesMoved:withEvent:メソッドを示します。このメソッドは、指がデバイスにタッチした 後、その指が最初の位置から移動したときにシステムによって呼び出されます。MoveMeアプリケーションでは、 「Welcome」ボタンの内側で生じた動きだけを追跡します。その結果、このメソッドによってイベントの位置が確認され、そ れに基づいてPlacardViewオブジェクトの中心点が調整されます。ビューの移動によって、ビューが新しい位置で自動的に再 描画されます。 - 35 -

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject];

// タッチがplacardView内で生じた場合には、その位置までplacardViewを移動する if ([touch view] == placardView) { CGPoint location = [touch locationInView]; location = [self convertPoint:location fromView:placardView]; placardView.center = location; return; } } リスト6 タッチの移動に反応する

ユーザの指が最後に画面から離れると、MoveMeアプリケーションによって、開始位置であるアプリケーションウインドウの 中央にボタンを戻すアニメーションが開始されます。リスト7に、このアニメーションを開始するtouchesEnded:withEvent: メソッドを示します。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject];

// タッチがplacardView内で生じた場合には、中央に戻す if ([touch view] == placardView) { // インタラクティブ操作を無効にして、以降のタッチがアニメーションに影響しないようにする self.userInteractionEnabled = NO; [self animatePlacardViewToCenter]; return; } } リスト7 「Welcome」ボタンの解放

アプリケーションによるイベント処理プロセスが簡単になるように、touchesEnded:withEvent:では、ボタンが元の位置に戻 - 36 -

るアニメーションの実行中は、一時的にビューのタッチイベントを無効にします。無効にしなかった場合、イベント処理のそ れぞれのメソッドに、ボタンがアニメーションの実行中であるかどうかを判定して、実行中の場合にはアニメーションを中止 するというロジックを含める必要が生じます。ボタンが画面の中央に戻るまでの短い間、ユーザによるインタラクションを無 効にすることで、イベント処理のコードが簡単になり、余分なロジックが不要になります。元の位置に戻ると、MyViewクラス のanimationDidStop:finished:メソッドによってユーザのインタラクション操作が有効になり、イベントサイクルが再開され ます。

iPhone OSにおけるイベント処理の詳細については、『iPhone OS Programming Guide』の「Event Handling」を参照して ください。

ボタンの動きのアニメーション化 iPhoneアプリケーションでは、アニメーションは大きな役割を担っています。ユーザに対して文脈情報および即時のフィード バックを提供するためにアニメーションが多用されます。たとえば、生産性アプリケーションでユーザが階層構造のデータを 渡り歩くとき、iPhoneアプリケーションでは画面を別の画面に置き換えるのではなく、新しい画面を配置する動きをアニメー ションにします。動きの方向によって、ユーザが階層を上下する方向が表され、見るべき新しい情報があることを示す視覚的 な手がかりになります。

アニメーションが重視されることから、UIKitの各クラスにはアニメーションに対するサポートがあらかじめ組み込まれていま す。MoveMeアプリケーションでは、このサポートを活用して「Welcome」ボタンのさまざまな状況をアニメーション化して います。ユーザが初めてボタンをタッチすると、アプリケーションによってボタンが少しのあいだ拡大するアニメーションが 適用されます。ユーザがボタンを解放すると、別のアニメーションによってボタンが元の位置に戻ります。これらのアニメー ションを作成する基本的な手順は、実質的には同じです。

1.

アニメーションの対象となるビューのbeginAnimations:context:メソッドを呼び出します。

2.

アニメーションのプロパティを設定します。

3.

ビューのcommitAnimationsメソッドを呼び出してアニメーションを開始します。

リスト8に、「Welcome」ボタンが最初にタッチされたときに脈動させるためのアニメーション用コードを示します。このメ ソッドは、アニメーションの持続時間を設定し、ボタンを新しいサイズに拡大する変換を適用します。このアニメーションが 完了すると、アニメーションインフラストラクチャによってアニメーション委任オブジェクトの growAnimationDidStop:finished:context:メソッドが呼び出され、ボタンを少し縮めることで脈動のアニメーションが終了 します。

- 37 -

- (void)animateFirstTouchAtPoint:(CGPoint)touchPoint { #define GROW_ANIMATION_DURATION_SECONDS 0.15

NSValue *touchPointValue = [[NSValue valueWithCGPoint:touchPoint] retain]; [UIView beginAnimations:nil context:touchPointValue]; [UIView setAnimationDuration:GROW_ANIMATION_DURATION_SECONDS]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector: @selector(growAnimationDidStop:finished:context:)]; CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2); placardView.transform = transform; [UIView commitAnimations]; }

- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:SHRINK_ANIMATION_DURATION_SECONDS]; placardView.transform = CGAffineTransformMakeScale(1.1, 1.1); [UIView commitAnimations]; } リスト8 「Welcome」ボタンのアニメーション

組み込みのビューアニメーションの使用法の詳細については、『iPhone OS Programming Guide』の「Animating Views」 を参照してください。Core Animationの詳細については、『iPhone OS Programming Guide』の「Applying Core Animation Effects」を参照してください。

アプリケーションの終了 これまでの各節では、MoveMeアプリケーションを初期化する方法、ユーザインターフェイスを表示する方法、およびイベント に対して応答する方法を見てきました。アプリケーションをビルドしてデバイスにロードする前に、アプリケーション作成に 関するこうした側面に加えて、ほかにも検討しなければならない細かい事柄があります。用意しなければならない最後のピース の1つが、アプリケーションの情報プロパティリスト(Info.plist)ファイルです。これは、アプリケーションに関する基本的な情 報をシステムに伝えるXMLファイルです。Xcodeは、このファイルのデフォルト版を作成してアプリケーションの初期の設定情 報を挿入します。しかし、この情報を拡張して、システムが知っておくべきアプリケーションに関する他の詳細を追加すること

- 38 -

もできます。たとえば、このファイルを使用してアプリケーションのバージョン、サポートしているカスタムのURLスキーム、 起動時に表示する画像、およびシステムステータスバーのデフォルトの表示状態とスタイルを伝えることができます。

リスト9に、MoveMeアプリケーションのInfo.plistファイルの内容を示します。このファイルは、実行可能ファイルの名前、 ユーザのホーム画面に表示する画像ファイル、およびシステムに対してアプリケーションを一意に識別する文字列を示しま す。MoveMeアプリケーションはフルスクリーンのアプリケーションなので(つまり、ステータスバーを表示しません)、ファ イルにはUIStatusBarHiddenキーも含まれており、trueが値として割り当てられています。このキーをtrueに設定すると、シ ステムは起動時およびアプリケーションの実行中にアプリケーションステータスバーを表示すべきでないと認識しま す。MoveMeアプリケーションでは、この振る舞いをプログラムの中で設定することも可能ですが、その設定はアプリケー ションが起動してからでないと効果がないため、奇妙に見えるかもしれません。

- 39 -

CFBundleDevelopmentRegion <string>en CFBundleDisplayName <string>${PRODUCT_NAME} CFBundleExecutable <string>${EXECUTABLE_NAME} CFBundleIconFile <string> CFBundleIdentifier <string>com.yourcompany.${PRODUCT_NAME:identifier} CFBundleInfoDictionaryVersion <string>6.0 CFBundleName <string>${PRODUCT_NAME} CFBundlePackageType <string>APPL CFBundleSignature <string>???? CFBundleVersion <string>1.0 UIStatusBarHidden <true/> リスト9 Info.plistファイルの内容

- 40 -

注:アプリケーションのInfo.plistファイルの内容は、テキストエディットまたはProperty List Editorアプリケー ションを使用して編集できます。Xcodeでは、アプリケーションターゲットに対応する情報ウインドウでこれらの属 性のいくつかにアクセスできます。このウインドウを表示するには、アプリケーションターゲットを(「ターゲッ ト」グループの中で)選択し、「ファイル」>「情報を見る」を選びます。「プロパティ」タブに、Info.plistファイ ル内のプロパティの一部(全部ではありません)が含まれています。

アプリケーションのInfo.plistファイルを設定する方法の詳細については、『iPhone OS Programming Guide』の「The Information Property List」を参照してください。

最後のピースをはめることができたので、自分独自のiPhoneアプリケーションを作成するために必要な基本的な情報がすべて ったことになります。次のステップは、ここで学んだ情報を土台に、iPhone OSの機能についてさらに学習することで知識 を広げることです。アプリケーションを作成するにあたっては、ユーザが快適かつ直感的な操作体験を得られるよう に、iPhone OSに組み込まれている機能を活用すべきです。これらの機能の一部については、「アプリケーションの強化」でも 説明していますが、機能を網羅したリストおよびそれらを使用する方法に関しては、『iPhone OS Programming Guide』を 参照してください。

アプリケーションの強化 ユーザが当然のものとして考えるiPhoneおよびiPod touchの機能が数多くあります。これらの機能の一部は、デバイスの向き に対応してビューを自動的に調整する機能など、ハードウェアに関係します。ほかの一部は、iPhoneの組み込みアプリケー ションがすべて同じ連絡先リストを共有するなど、ソフトウェアに関係します。以降で説明する機能のあまりにも多くが、 ユーザの基本的な操作体験と切り離せないため、それらがこれから開発するアプリケーションにどのように当てはまるかを初 期の設計時に検討すべきです。

加速度計を用いた向きと動きの追跡 iPhoneおよびiPod touchの加速度計は、システムおよび自分のアプリケーションにとって貴重な入力を提供します。加速度計 は、単独の線形の軸に沿って速度の変化を測定します。iPhoneおよびiPod touchはどちらも3つの加速度計を備えており、三 次元空間のそれぞれの主軸に沿って変化を測定することで、任意の方向への動きを検出できるようになっています。

- 41 -

図4 加速度計の軸

加速度の変化を測定することが有用には思えないかもしれませんが、実際にはこの情報を使用することで可能なことが数多く あります。重力は、物体を常に地面の方向へ引っ張ろうとします。この力によって、デバイスがたとえ動いていなくても、地面 の方向へ測定可能な量の加速が生じます。どの加速度計がこの加速を記録していて、その加速がどれほどであるかを追跡する ことで、三次元空間におけるデバイスの向きをかなり正確に検知できます。向きがわかったら、これをアプリケーションへの 入力として適用できます。

システムは、加速度計を利用してデバイスの現在の向きを監視し、向きに変化があったときにそれをアプリケーションに通知 します。アプリケーションのインターフェイスをランドスケープ(横長)またはポートレート(縦長)の両方モードで表示でき る場合には、ビューコントローラを基本設計に組み込むべきです。UIViewControllerクラスは、向きの変化に対応してイン ターフェイスを回転し、ビューの位置を自動的に調整するために必要なインフラストラクチャを提供します。

加速度計の生のデータに直接アクセスしたい場合は、UIKitの共有のUIAccelerometerオブジェクトを使用することでそれが可 能です。UIAccelerometerオブジェクトは、設定可能な間隔で加速度計の現在の値を報告します。またデータを使用して、デ バイスの向きを検知したり、ユーザがデバイスを前後にゆするなど他の瞬間的な動きを検知したりもできます。その後、この - 42 -

情報をゲームや他のアプリケーションへの入力として使用できます。UIAccelerometerオブジェクトを設定して加速度計イベ ントを取得する方法の例については、『iPhone OS Programming Guide』の「Accessing Accelerometer Events」を参照し てください。

図5 ユーザの連絡先情報へのアクセス

ユーザの連絡先情報へのアクセス ユーザの連絡先情報は、すべてのシステムアプリケーションが共有する重要なリ ソースです。Phone、MailおよびSMS Textアプリケーションでは、ユーザが連絡 する必要のある人々を識別し、電話、電子メール、テキストメッセージなどの基本 的なインタラクティブ操作を開始するために使用されます。自分のアプリケーショ ンでも、同様の目的あるいはアプリケーションで必要となる情報を取得するため に、連絡先情報にアクセスできます。

iPhone OSでは、ユーザの連絡先情報に直接アクセスすることも、標準のピッカー インターフェイスのセットを利用して間接的にアクセスすることもできます。直接 アクセスの場合、連絡先情報を連絡先データベースから直接取得できます。この情 報は、連絡先情報を別の方法で提示したり、アプリケーション固有の基準に基づ いてフィルタを適用したりするために使用できます。しかし、カスタムのインター フェイスを必要としない場合は、iPhone OSによって連絡先の選択および作成のた めの標準のシステムインターフェイスのセットも提供されます。これらのインター フェイスをアプリケーションに組み込む労力はわずかですが、アプリケーション に対して、あたかもシステムの一部であるかのようなルックアンドフィールを与えます。

ユーザの連絡先情報へのアクセスは、Address BookおよびAddress Book UIの各フレームワークを使用して行います。これら のフレームワークの詳細については、「Address Book Framework Reference」および「Address Book UI Framework Reference」を参照してください。

ユーザの現在位置の取得 iPhone OSを実行するデバイスは、あちこち移動するユーザのためのものです。したがって、これらのデバイス向けに作成する ソフトウェアも、この事実を考慮すべきです。また、インターネットとWebのおかげでどこでも仕事ができるようになったの で、ユーザの現在の位置に合わせて情報を提供できれば、魅力的なユーザ体験を演出できます。たとえば、ロサンゼルスにい る喉が渇いている人に対してニューヨークのコーヒーショップを案内してもしょうがありません。そこで役立つのがCore Locationフレームワークです。

- 43 -

Core Locationフレームワークは、携帯電話の基地局およびWi-Fiホットスポットからの電波信号を監視し、ユーザの現在位置 を三角法によって測位します。このフレームワークを使用して初期の位置を取得したり、ユーザの位置に変化があったときに 通知を必ず受け取ったりできます。この情報を使用して、アプリケーションが提供する情報にフィルタを適用したり、その他 の方法で使用したりできます。

アプリケーションの中で位置データを取得する方法の例については、『iPhone OS Programming Guide』の「Getting the User's Current Location」を参照してください。

図6 カスタムビデオの再生

オーディオとビデオの再生 iPhone OSでは、Core Audioフレームワーク およびOpenALフレームワークを通じてアプ リケーションのオーディオ機能をサポート し、Media Playerフレームワークを使用して ビデオ再生をサポートします。Core Audioで は、サウンドの再生、録音、操作のほか、ス トリーミングオーディオの解析のために高度 なインターフェイスを提供します。単純なサ ウンド効果またはマルチチャネルのオーディオを再生したり、サウンドをミクシングしてそれをオーディオフィールドの中でポ ジション決めしたり、iPhoneの振動機能を起動したりもできます。ゲーム開発者の場合、Open ALを活用するコードを持って いれば、iPhone OSの中でそのコードを使用してゲーム中のオーディオのポジションを決めたり再生したりできます。

フルスクリーンのビデオファイルを再生するには、Media Playerフレームワークを使用します。このフレームワークでは、多く の標準ムービーファイル形式の再生がサポートされており、ユーザコントロールを表示するかどうかや、ビデオコンテンツの縦 横比を設定する方法など、再生環境を制御できます。ゲーム開発者は、このフレームワークを使用してカットシーンや他の事前 レンダリングされたコンテンツを再生できます。また、メディアベースのアプリケーションでは、このフレームワークを使用し てムービーファイルを再生できます。

iPhone OSにおけるメディアテクノロジーの詳細については、『iPhone OS Programming Guide』の「Audio and Video Technologies」を参照してください。

図7 iPhoneのカメラ

- 44 -

組み込みのカメラを使った撮影 iPhoneのCameraアプリケーションでは、写真を撮ったり、それを自分のコンピュー タからアップロードした他の写真と一緒に一元的なフォトライブラリに格納したりで きます。また、iPod touchにはカメラはありませんが、ユーザがアップロードした写 真を格納するフォトライブラリがあります。iPhone OSにおいては、UIKitフレーム ワークのUIImagePickerControllerクラスを通じてこの両方の機能を利用できます。

UIImagePickerControllerクラスは、アプリケーションに対して、カメラ用および フォトライブラリ用のインターフェイスの実装を提供します。これらは、Cameraア プリケーションおよびPhotosアプリケーションを含む他のアプリケーションによっ て使用される標準のシステムインターフェイスです。ピッカーインターフェイスを表 示すると、ピッカーコントローラによってユーザとの必要なやりとりがすべて処理さ れ、結果の画像がアプリケーションに返されます。

ピッカーインターフェイスの使用法の詳細については、『iPhone OS Programming Guide』の「Taking Pictures with the Camera」および「Picking a Photo from the Photo Library」を参照してください。

- 45 -

Cocoaデベロッパ向けiPhone OS

Cocoaデベロッパの方であれば、iPhone OSに提供されているフレームワークの多くに馴染みがあるはずです。iPhone OSの基 本的なテクノロジースタックは、多くの点でMac OS Xのものと似ています。しかし類似性がある一方、iPhone OSのフレーム ワークは、Mac OS Xの対応するフレームワークとは完全に同じではありません。この記事では、iPhoneアプリケーションの開 発を進める中で直面する可能性のある主な違いと、それらの違いに対処するために自分のコードをどのように調整すればよい かについて解説します。

Foundationフレームワーク Foundationフレームワークには、値オブジェクト、文字列、コレクション、スレッド管理など、熟達したCocoaデベロッパの 方が期待しているほとんどのクラスが含まれています。しかし、いくつかのクラスは、iPhone OSのバージョンのFoundation フレームワークには含まれていません。

表1に、iPhone OSのFoundationフレームワークにはない主な機能の領域をいくつか示します。また、関連クラスを利用でき ない理由と、代わりに使用すべき代替テクノロジーも示します。Mac OS Xで利用でき、iPhone OSでは利用できない特定のク ラスの一覧については、「Foundation Framework Reference」の「The Foundation Framework」にあるクラス階層図を参 照してください。

表1 Foundationテクノロジーの相違 テクノロジー

メモ

XMLのパース

iPhone OSでは、XMLのパースはNSXMLファミリのクラスではなくlibXML2ライブ ラリを通じてサポートされます。libXML2ライブラリは、iPhone OSでの使用によ り適した非常に軽量なパースインターフェイスを提供します。libXML2の使用に関す る詳細については、http://xmlsoft.org/index.htmlを参照してください。

メタデータと述語の管理

Spotlightのメタデータと検索熟語は、Spotlight自体がiPhone OSでサポートされて いないため、サポートされていません。

分散オブジェクトとポート名

分散オブジェクトテクノロジーは利用できませんが、NSPortファミリのクラスを

サーバ管理

使ってポートおよびソケットとやり取りできます。また、Core Foundationと CFNetworkフレームワークを使ってネットワークの要件に対応することもできま す。

Bonjour管理

NSNetServiceおよびNSNetServiceBrowserクラスは利用できませんが、これらに相 当するCore Foundationのクラスは利用できます。CFNetServices不透過(opaque) 型によりBonjourネットワーキングを実行できます。これはCFNetworkフレーム ワークに含まれています。

- 46 -

Cocoaバインディング

CocoaバインディングはiPhone OSではサポートされません。代わりに、iPhone OSでは、ターゲット/アクションモデルを若干修正したバージョンを採用してお り、コード中のアクションの処理方法に柔軟性が加わっています。iPhone OSの ターゲット/アクションモデルの詳細については、『UIControl Class Reference』 を参照してください。

Objective-Cのガベージコレ

ガベージコレクションは、iPhone OSではサポートされません。代わりに、メモリ

クション

管理されたモデルを使う必要があります。このモデルでは、オブジェクトを保持し て所有権を要求し、不要になったらオブジェクトを解放します。

AppleScriptサポート

AppleScriptは、iPhone OSではサポートされません。

アンドゥ管理

NSUndoManagerは、iPhone OSでは利用できず、操作の取り消しのための自動サ ポートもありません。

iPhone OSのFoundationフレームワークの完全なクラスとメソッドの情報については、「Foundation Framework Reference」を参照してください。

UIKitとAppKit 熟達したCocoaデベロッパなら、Mac OS XのAppKitフレームワークとiPhone OSのUIKitフレームワークの類似性に気づくで しょう。UIKitフレームワークは、AppKitフレームワークの表記法と機能を念頭において書かれました。しかし、UIKitは、さま ざまな要件を持つさまざまなプラットフォーム向けに設計、構築されています。Cocoaアプリケーションのシンボルの名前 を、UIKitの同様のシンボル名と一致するように変更すると、アプリケーションをiPhone OSで動作できなくなる可能性があり ます。2つのフレームワーク間の構造上、および動作上の相違により、iPhone OSに移行するAppKitコードの改訂(あるいは書 き直し)が必要になります。

それでも2つのフレームワークを並べて比較すると、表2に示すような相違があることがわかります。

表2 アプリケーションテクノロジーの相違 相違

説明

アクセサメソッドとプロ

最も大きな相違の1つは、UIKitクラス宣言全体を通してプロパティが広く使われているこ

パティの使用

とです。プロパティはMac OS Xバージョン10.5から導入されました。つまり、AppKitフ レームワークで多くのクラスが作成された後に導入されたものです。UIKitでは、単に AppKitの同じgetterおよびsetterメソッドを模倣するのではなく、クラスインターフェイ スを簡素化する方法としてプロパティを採用しています。プロパティの詳細については、 『Objective-C 2.0プログラミング言語』の「プロパティ」を参照してください。

- 47 -

ビュークラス

iPhoneアプリケーションでは、より専門的な一連のカスタムビューとカスタムコント ロールを利用できます。AppKitにあるビューとコントロールの多くは、iPhone OSベー スのデバイスではうまく動作しない可能性があります。ボックス、ブラウザ、タブ ビュー、分割ビューなどの組織的なコントロールは必要でないか、またはより適した選 択肢があります。たとえば、NSBrowserクラスを提供する代わりに、iPhoneではまった く異なるパラダイム(ナビゲーションコントロール)を使って階層情報の表示を管理しま す。iPhone OSで利用できるビューとコントロールと、その使いかたの詳細については、 『iPhone Human Interface Guidelines』を参照してください。

イベント処理

iPhone OSのイベント処理モデルは、Mac OS Xのモデルとは若干異なります。マウスイ ベントとキーボードイベントの代わりに、iPhone OSでは、新しい一連のハンドラメソッ ドを通じて1つまたは複数のタッチイベントを送ります。これらのイベントを解釈、追跡 する方法も異なり、『iPhone OS Programming Guide』の「Event Handling」に詳細 が説明されています。

ターゲット/アクション

iPhone OSのターゲット/アクションモデルは、アクションメソッド定義の3つのバリ

モデル

エーションをサポートしており(AppKitでは1つ)、各メソッドを、コントロールに関連 する各種のアクションと関連付けることができます。さらに、コントロールは、同じアク ションに複数のターゲットを割り当てることができるため、1回のアクションで複数の メッセージが配送されます。iPhone OSのターゲット/アクションモデルの詳細について は、『UIControl Class Reference』を参照してください。

描画と印刷サポート

UIKitの描画機能は、UIKitクラスのレンダリング要件をサポートするように拡張されてい ます。このサポートには、画像のロードと表示、文字列の表示、カラー管理、フォント 管理、および矩形の描画とグラフィックスコンテキストの取得を行ういくつかの関数が 含まれています。UIKitには、汎用の描画クラスは含まれていません。いくつかほかの選 択肢(QuartzとOpenGL ES)が、iPhone OSにすでにあるためです。印刷は、プリンタ やほかの印刷関連のハードウェアをiPhone OSベースのデバイスに接続するための直接的 なサポートがないため、サポートされていません。自動カラーマッチングも提供されてい ません。iPhone OSの描画に関する詳細については、この記事の後述の「座標系」、お よび『iPhone OS Programming Guide』の「Graphics and Drawing」を参照してくだ さい。

テキストサポート

iPhone OSのテキストサポートは、電子メールとメモの作成を対象としています。UIKit クラスを使ってアプリケーションは、簡単な文字列と、多少複雑なHTMLコンテンツの表 示と編集を行うことができます。高度なワードプロセッサにあるような高度なテキスト レイアウトやグリフ生成機能は、モバイル環境にはほとんど必要とされないた め、iPhone OSには含まれていません。

- 48 -

ドキュメントのサポート

iPhone OSでは、アプリケーションは通常、ウインドウは1つのみであり、個別のドキュ メントオブジェクトやドキュメントウインドウは使用しません。このため、アプリケー ションによって開いたファイルはすべて、そのアプリケーションによって直接管理され、 ウインドウの内容の更新に使われます。

コントロールとセル

UIKitのコントロールは、セルを使いません。セルは、Mac OS Xではビューに代わる軽量 の選択肢として使われます。UIKitでは、ビュー自体が非常に軽量なオブジェクトである ため、セルは必要ありません。命名規則に反して、UITableViewクラスで使うように設計 されたセルが、実際にはUIViewクラスに基づいています。

テーブルビュー

iPhone OSのUITableViewクラスは、AppKitフレームワークのNSTableViewクラスと NSOutlineViewクラスの中間と考えることができます。この2つのAppKitクラスからの 機能を使って、小さな画面でのデータの表示により適したツールを作成していま す。UITableViewクラスは一度に1つのカラムを表示し、関連する行をセクションにグ ループ化できます。情報の階層的なリストを表示、編集するための手段でもありま す。UITableViewクラスの詳細については、『UITableView Class Reference』を参照し てください。

メニュー

メニューは、iPhone OSではサポートされていないもう1つのユーザインターフェイスパ ラダイムです。iPhone OS向けに記述されたほとんどすべてのアプリケーションは、対応 するMac OS Xアプリケーションよりもコマンドセットがはるかに小さいため、メニュー は一般に必要ありません。必要な数少ないコマンドに対しては、ツールバーまたは一連 のボタンのほうが通常はより適しています。データに基づくメニューに対しては、多くの 場合はピッカーまたはナビゲーションコントローラインターフェイスが適しています。

iPhone OSでは、すべての描画サーフェスの背後にはCore Animationレイヤがあり、多くのビュー関連プロパティに対して暗 黙的なアニメーション化のサポートがすでに実装されています。アニメーションサポートが組み込まれているため、通常は コード中に明示的にCore Animationレイヤを使う必要はありません。ほとんどのアニメーションは、単に、対象となるビュー の必要なプロパティを変更するだけで実行できます。レイヤを直接使う必要があるのは、レイヤツリーを厳密に制御する必要 があるときや、ビューレベルで公開されていない機能を使う必要があるときだけです。

概念上は、iPhone OSのウインドウとビューは、Mac OS Xの場合と同様に同じ構成体を表しています。しかし、実装の観点で は、この2つのプラットフォームはウインドウとビューをまったく異なった方法で実装しています。Mac OS Xで は、NSWindowクラスはNSResponderのサブクラスですが、iPhone OSではUIWindowクラスは実際にはUIViewのサブクラ スです。つまりUIKitでは、ウインドウにも加速的な描画のためのCore Animationレイヤがあるということです。

iPhone OSとMac OS Xの間のもう1つの違いは、ウインドウが使われる方法です。典型的なMac OS Xアプリケーションには、 文書、ツールパレット、パネルを表す複数のウインドウがありますが、典型的なiPhoneアプリケーションには、すべてのコン

- 49 -

テンツの表示に関与するウインドウが1つあるだけです。iPhoneアプリケーションでの異なるコンテンツの表示は、ウインド ウを切り替えることによってではなく、ウインドウのコンテンツ表示を変更することによって行われます。

注:UIKitキットでは、ウインドウを持つ主な理由は、画面上のさまざまなビジュアルレイヤで、ウインドウをグルー プ化できるようにすることです。たとえば、システムアラートウインドウとステータスウインドウを、アプリケー ションのウインドウのレベルよりも1つ上のレベルに配置することにより、これらのウインドウを確実に表示できま す。 UIKitのクラスの詳細については、「UIKit Framework Reference」を参照してください。

その他のフレームワークの変更 表3に、iPhone OSとMac OS Xによって共有されているその他のフレームワークにおける、主な相違を示します。

表3 iPhone OSとMac OS Xに共通のフレームワークにおける相違 フレームワーク

相違

AddressBook.framework

ユーザの連絡先情報にアクセスするためのインターフェイスが含まれていま す。iPhone OSでは、このフレームワークのインターフェイスはObjective-Cで はなく、Cで書かれています。詳細については、「Address Book Framework Reference」を参照してください。

AudioToolbox.framework

これらのフレームワークのiPhone OSバージョンは、主に、シングルまたはマル

AudioUnit.framework

チチャンネルオーディオコンテンツの記録、再生、ミックスのためのサポートを

CoreAudio.framework

提供します。高度なオーディオプロセッシング機能や、カスタムオーディオユ ニットプラグインはサポートされていません。ただし、iPhone OSには、iPhone デバイス向けにバイブレートオプションをトリガする機能が追加されています。 オーディオサポートの使いかたの詳細については、『iPhone OS Programming Guide』の「Audio and Video Technologies」を参照してください。

CFNetwork.framework

Core Foundation Networkインターフェイスが含まれています。iPhone OSで は、CFNetworkフレームワークはサブフレームワークではなく、最上位のフレー ムワークです。ただし、実際のインターフェイスのほとんどは変わっていませ ん。詳細については、「CFNetwork Framework Reference」を参照してくださ い。

- 50 -

CoreGraphics.framework

Quartzインターフェイスが含まれています。iPhone OSでは、Core Graphicsフ レームワークはサブフレームワークではなく、最上位のフレームワークで す。Quartzを使って、Mac OS Xの場合とまったく同じ方法で、パス、グラデー ション、パターン、色、イメージ、ビットマップを作成できます。ただ し、CGLayerサポート、PostScriptサポート、イメージのソースとデスティネー ション、Quartz Display Servicesサポート、Quartz Event Servicesサポートな ど、いくつかのQuartz機能はiPhone OSには含まれていません。詳細について は、「Core Graphics Framework Reference」を参照してください。

QuartzCore.framework

Core Animationインターフェイスが含まれています。Core Animationインター フェイスのほとんどは、iPhone OSとMac OS Xとで同じです。しかし、iPhone OSでは、レイアウトの制約を管理するためのクラスは利用できず、Core Image フィルタの使用もサポートされていません。また、Core ImageおよびCore Video(これらもフレームワークのMac OS Xバージョンには含まれています)の インターフェイスはありません。詳細については、「Quartz Core Framework Reference」を参照してください。

Security.framework

セキュリティインターフェイスが含まれています。iPhone OSでは、このフレー ムワークは、暗号化と復号、擬似乱数生成、Keychainのサポートを提供するこ とにより、アプリケーションデータのセキュリティ確保にフォーカスしていま す。このフレームワークには認証または承認のインターフェイスは含まれていま せん。また証明書の内容の表示もサポートされていません。さらに、Keychain インターフェイスは、Mac OS Xで使われているKeychainインターフェイスの簡 略版です。セキュリティサポートの詳細については、『iPhone OS Programming Guide』の「Security」を参照してください。

SystemConfiguration.framew

ネットワーク関連インターフェイスが含まれています。iPhone OSでは、このフ

ork

レームワークには到達性のためのインターフェイスのみ含まれています。これら のインターフェイスを使って、デバイスがどのような方法でネットワークに接続 されているか(たとえば、EDGE、GPRS、またはWi-fiが使われているなど)を 特定できます。

OpenGLに関する留意事項 iPhone OSに含まれているOpenGLのバージョンは、OpenGL ESバージョン1.1であり、これは組み込みシステム向けに特別に 設計されたOpenGLのバージョンです。OpenGLデベロッパの方なら、OpenGL ESインターフェイスには馴染みがあるはずで す。ただし、OpenGL ESインターフェイスにもいくつか重要な点で相違があります。1つは、使用可能なグラフィックスハード ウェアを使って効率よく実行できる機能のみをサポートしているため、非常にコンパクトなインターフェイスである点です。も う1つは、デスクトップOpenGLで標準的に使用する拡張子の多くが、OpenGL ESでは使用できない可能性がある点です。この ような相違がありますが、デスクトップ上で通常考えられる操作のほとんどは、同じように実行できます。ただし、既存の - 51 -

OpenGLコードを移植する場合、iPhone OSで異なる描画技術を使用するには、コードの一部を書き直す必要が生じるかもし れません。

iPhone OSのOpenGL ESサポートの詳細については、『iPhone OS Programming Guide』の「Drawing with OpenGL ES」 を参照してください。

座標系 iPhone OSでは、QuartzとUIKitコンテンツのための描画モデルは、1つの例外を除きMac OS Xのモデルとほとんど同じで す。Mac OS Xの描画モデルでは、ウインドウとビューの原点はデフォルトでは左下隅にあり、軸は右上に伸びます。iPhone OSでは、図1に示すように、原点は左上隅、軸は右下に伸びます。Mac OS Xでは、この座標系は「反転した」座標系と呼ばれ ることがあります。

図1 iPhone OSのネイティブの座標系

iPhone OSのグラフィックスサポートの詳細については、『iPhone OS Programming Guide』の「Graphics and Drawing」を参照し てください。

メモリ管理 iPhone OSでは常に、メモリ管理されたモデルを使ってオブジェク トの保持、解放、自動解放を行います。ガベージコレクション は、iPhone OSではサポートされません。

iPhone OSベースのデバイスでは、メモリはMacintoshコンピュータ よりもさらに厳しく制限されるため、自動解放プールの使用を調整 して、自動解放されたオブジェクトの蓄積を防ぐ必要があります。 可能な場合は常に、オブジェクトを自動解放するのではなく、直接 的に解放する必要があります。自動解放したオブジェクトを短い ループで割り当てるような状況では、これらのオブジェクトを直接 解放するか、ループコード内の適切な場所に自動解放プールを作成 して一定の間隔でオブジェクトを解放する必要があります。ループの 終了まで待機すると、メモリ不足の警告やアプリケーションの強制 終了につながることがあります。詳細およびメモリ管理のヒントについては、 『iPhone OS Programming Guide』の 「Application Design Guidelines」を参照してください。

- 52 -