Objective-C まとめ

Objective-­‐C まとめ Objective-C まとめ
1
Objective-­‐C まとめ 1.Objective –C
Objective-C は、オブジェクト指向プログラミング言語です。オブジェクト指向
は、Smalltalk という言語において世界で初めて採用されました。その機能を C
言語に追加したものが、Objective-C です。
① オブジェクト指向プログラミングの概要
オブジェクト指向プログラミングとは関連するデータの集合と、それに対する
手続き(メソッド)を「オブジェクト」と呼ばれる一つのまとまりとして管理しま
す。オブジェクトの利用に際してその内部構造や動作原理の詳細を知る必要は
なく、外部からメッセージを送れば機能するため、特に大規模なソフトウェア
開発において有効な考え方であるとされています。
これだけだと概念じみていて分かりにくいですが、Xcodeのプロジェクト作成画
面の右下に、Object Libraryに表示されているボタンやビューなどを思い浮かべ
れば理解できると思います。これらのオブジェクトがどのように設計されてい
るのか詳細まで考えずに、手軽に利用できる点がオブジェクト指向プログラミ
ングのメリットと言えます。
2
Objective-­‐C まとめ ②オブジェクト指向プログラミングの特徴
1. クラスとインスタンス
オブジェクトはクラスというオブジェクトの定義ファイルをもとにして
(言わば設計図として)メインメモリにインスタンス(実体という意味
になります)を作成して使用します。インスタンスはクラスという設計
図をもとに数に制限なくいくつでも作ることができます。
2. モジュール化
オブジェクトはある目的を達成するための必要なデータ構造とコードと
呼ばれる作業を行う部分(一般的には関数やメソッドなどと呼ばれます)
を内部に含んでいるモジュール (交換可能な単位) 化されたソフトウェ
アの構成部品もしくは構成要素になっています。
3.継承
オブジェクトはほかのオブジェクトを親として、そのデータ構造とコー
ドのすべてを継承することができます。そして親から譲り受けたコード
の一部を変更することや、あるいは新しいデータ構造やコードを追加す
ることができます。この親となるクラスのことをスーパークラスもしく
は親クラスと呼びます。そして子となるクラスのことをサブクラスもし
くは子クラスと呼びます。
3
Objective-­‐C まとめ ③objective-C
オブジェクト指向プログラミングにはSmalltalk、java、C++、C#など様々な言
語があります。これら言語ごとにインターフェース設計(デザインパターン)
があり、そのデザインパターンを利用してコーディングを行います。
Objective-Cの場合こうした他の言語と比較してもデザインパターンが多
少複雑ですが、それだけ多様なアプリケーションの作成が可能です。
Objective-Cでいうデザインパターンには以下のような種類があります。
● モデル-ビュー-コントローラ - アプリケーション全体の構造を規定するパタ
ーンです。
● デリゲート - 情報やデータの処理をほかのオブジェクトに委任するために
用います。
● ターゲット-アクション - ボタンその他を介したユーザ入力を、アプリケー
ションが実行するコードに対応づけます。
● ブロックオブジェクト - コールバックや非同期コードを実装するために使
います。
● サンドボックス化 - iOSアプリケーションはすべて、システムやほかのアプ
リケーションを保護するため、サンドボックス内に置かれます。サンドボック
スの構造により、アプリケーションが使うファイルの配置や、データのバック
アップなど関連機能が影響を受けます。
4
Objective-­‐C まとめ 2.Xcodeの環境設定をする メニューバーの『Xcode』→『Behaviors』→『Edit Behaviors』を選択し、環
境設定を行います。 5
Objective-­‐C まとめ ① 行番号の表示 Behaviorsのツールバーより『Text Editing』を選択します。Line numbersのチ
ェックボックスをオンにしましょう。これでコード編集画面に行番号が表示さ
れます。 6
Objective-­‐C まとめ ② インデントの設定 Text Editingを表示した状態で、『Indentation』タブを選択します。Line wrappingのチェックボックスをオンにしましょう。これで行の折り返し時のイ
ンデント設定がされ、見やすくなります。
7
Objective-­‐C まとめ 3.Hello Worldを表示する この章ではXcodeからプロジェクトを作成しiphoneシミュレータ上にHello Worldを表示し、簡単な動作を確認します。 ①Xcodeを起動し、メニューよりCreate a new Xcode projectを選択します。 8
Objective-­‐C まとめ ②左メニューよりiOS→Application→Single View Applicationを選択します。 9
Objective-­‐C まとめ ③プロジェクト名の入力 Product Nameを「HelloWorld」とします。Device FamilyをiPhoneにし、チェッ
クボックスはUse StoryboardとUse Automatic Reference Countingを選択して
ください。Include Unit Testsは今回のプロジェクトでは不要です。 ※ チェックボックス ・「Use Storyboard」…インターフェースビルダーにStoryboardを使用する。こ
のチェックをオンにしない場合、インターフェースビルダーにxibが使用される。
・「Use Automatic Reference Counting」…Automatic Reference Counting (ARC) for Objective-Cによって、メモリ管理をコンパイラの仕事にします。 ・「Include Unit Tests」…Unit Testsクラスを作成します。 10
Objective-­‐C まとめ ④作成先フォルダを選択する 最初にプロジェクトを作成する際は、左下のNew Folderボタンからデスクトッ
プにプロジェクト用の親フォルダを作っておきましょう。作成するフォルダを
選択したら、Createボタンを押します。 ※チェックボックス ・「Source Control」…Xcode4.2からバージョン管理ツールにgitが使えるよう
になりました。このチェックボックスをオンにすることで、git用のリポジトリ
を作成します。 11
Objective-­‐C まとめ ⑤左のShow the Project navigatorウインドウより、MainStoryboard.storyboard
を選択します。ここでiPhone上に表示されるボタンやラベルなどのインターフ
ェースのデザインを行います。 12
Objective-­‐C まとめ ⑥Labelのテキストを変更する 右下のObjectよりLabelをView Controllerにドラッグ&ドロップします。 View Controllerに配置したLabelを選択すると、右のUtilityウインドウのShow the Attributes Inspectorタブ内が自動で表示されます。TextがLabelとなって
いるので、これをHello Worldに変更します。 13
Objective-­‐C まとめ ⑦Labelのサイズを変更する LabelのテキストをHello Worldに変更すると、初期のLabelの大きさでは全体が
表示されず、Hello…という表示になってしまいます。全体が表示されるように
サイズを変更します。 View Controller上のLabelをクリックすると、周囲にサイズ変更用の枠が表示
されます。枠をドラッグして十分なサイズに拡大してください。 右のUtilityウインドウのShow the Attributes Inspectorタブ内のAlignmentを
変更することで文字を左寄寄せ、中央寄せ、右寄せにすることができます。 14
Objective-­‐C まとめ ▶ ボタンを押す(command+Rキーでシ
⑧シミュレータの起動ウインドウ左上の○
ョートカット)とシミュレータを起動します。無事に起動されました。 15
Objective-­‐C まとめ 4.Xcodeの各ファイルの理解 前回の章でMainStoryboard.storyboardによる簡単なプロジェクト作成を行い
ました。ここではその他のファイルに対する理解を深めます。 Objective-Cのソースコードは、宣言とオブジェクトのインターフェイスは、拡
張子.hを付けたヘッダ ファイルに記述し、定義とオブジェクトの実装は、拡張
子.m(メソッド[method]の略)を 付けたファイルに記述します。 ①AppDelegate.h #import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
#import <UIKit/UIKit.h>
#import<UIKit/UIKit.h>でヘッダファイルをimportしています。C言語における
#includeとの違いですが、importでヘッダファイルを読み込んだ場合はすでに
読み込んでいるヘッダファイルを再び読み込まないことを保証することになっ
ています。includeの場合はincludeするたびにヘッダファイルが読み込まれま
す。結果として同じ関数などが重複して定義されることになりエラーを起こす
場合があります。importはこの問題を回避しています。 @interface AppDelegate : UIResponder <UIApplicationDelegate>
構文としては @interface ClassName :ItsSuperclass < protocol> となって
います。 16
Objective-­‐C まとめ ここではAppDelegateがクラス名、UIResponderがスーパークラス、
UIapplicationDelegateプロトコルを採用しているということになります。 UIResponderクラスは、画面タッチやデバイスのシェイクなどのイベントを管理
するクラスです。 プロトコルが指定されているクラスは、そのプロトコルを採用していると呼ぶ
ことができます。 プロトコルを採用しているクラスは、そのプロトコルで宣言
されているメソッドを必ず実装しなければなりません Delegateとは代理人とか代表者とか委譲などという意味があります。 通常ある
オブジェクトへと送られてくるメッセージはそのオブジェクトで処理するべき
なのですが、いちいちそのオブジェクトのファイルを作るのは面倒という場合
があります。 その場合に別のクラスに送られてきたメッセージを丸投げしてし
まうと、そのオブジェクト自体に特有の処理を書くなどしなくて良くなるため
便利というわけです。 @property (strong, nonatomic) UIWindow *window;
インスタン変数の値を設定するメソッドをセッター(setter)メソッド。イン
スタン変数の値を取得するメソッドをゲッター(getter)メソッドと呼びます。
そしてこの2つメソッドをあわせてアクセサメソッドもしくは単にアクセサ
(accesser)と呼びます。プロパティとは、
「クラスにアクセッサメソッドを簡
単に付加する」ために導入されたものです。 AppDelegateクラスにUIWindowクラスの*windowオブジェクトに対するアクセ差
メソッドを付与しています。 @end
この記述でインターフェース部の終わりを表しています。 17
Objective-­‐C まとめ ②AppDelegate.m #import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
return YES;
}
…中略
@end
#import "AppDelegate.h"
AppDelegate.hファイルのインポートを行います。 @implementation AppDelegate
ヘッダファイルの@interfaceと対応しています。AppDelegate.hで宣言した
AppDelegateクラスを実装します。 @synthesize window = _window;
ヘッダファイルの@propertyに対応しています。宣言したプロパティへのアクセ
サメソッドを生成するよう指示します 18
Objective-­‐C まとめ - (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
return YES;
}
- メソッドタイプ (BOOL) 戻り値の型 application メソッド名 :(UIAoolication *)application didFinishLaunchingWithOptions :(NSDictionary *)launchOptions メソッドの引数 UIApplicationDelegateのメソッドです。シグネチャの説明は上記のようになり
ます。このapplication didFinishLaunchingWithOptionsメソッドはアプリケー
ションが起動された時に呼ばれます。 UIApplicationDelegateには他にアプリケーションがバックグラウンド移動時
のメソッドや、アプリケーション終了時のメソッドが用意されています。 @end
この記述で実装部の終わりを表しています。 プロジェクトを作成した際に作成されるファイルには他にViewController.hお
よびViewController.mがありますが、これについては実際にアプリケーション
を作成しながらコーディングしていきましょう。 19
Objective-­‐C まとめ 5.じゃんけんゲーム作成 「もとまか日記乙」様のサイトを参考に、じゃんけんゲームを作成しながらア
プリケーション開発の基礎を学習します。最終的には下記のような画面で、グ
ー、チョキ、パーボタンを押すことでコンピュータとじゃんけんが出来るよう
に作成します。 20
Objective-­‐C まとめ ①プロジェクトの作成 『3.Hello Worldを表示する』と同様に、Xcodeを立ち上げ、新プロジェクトを
作成します。 1.Create a New Xcode Projectを選択 2 iOS→Application→Single View Applicationを選択 3.Product Nameを入力する 例janken ②インターフェースの作成
プロジェクトを作成したら左のShow the Project navigatorウインドウより
MainStoryboard.storyboardを選択します。画面View Controller Scene(左から
2番目の枠内)に表示される内容を確認しましょう。 ・ First Responder…イベント通知を最初にを受け取るインスタンス。 ・ View Controller…デフォルトではNSApplicationのインスタンス(アプリケ
ーション終了の処理などを行う)。 ・ View…画面表示を管理するUIViewクラス。 21
Objective-­‐C まとめ ②ラベルとボタンの配置 Xcode画面右下のオブジェクトライブラリからボタンとラベルをドラッグ&ド
ロップし、以下のように配置してください。上の3つがLabel、下の4つがRound Rect Buttonです。 22
Objective-­‐C まとめ ③オブジェクトの設定 配置したボタンとラベルのタイトルを設定します。View上に配置したボタンや
ラベルを選択するとXcode画面右側にインスペクタウインドウが表示されるの
で、そこからタイトルを変更します。 この機会にXcode画面右上のEditorボタン、Viewボタン、Inspectorボタンを一
通りクリックし、それぞれの動作を確認しておきましょう。 23
Objective-­‐C まとめ タイトルの変更作業を続けます。各オブジェクトのタイトルを以下のようにし
てください。 ▶ ボタンをおして、シミュレー
タイトルの変更が完了したら、Xcode画面左上の○
▶ ボタンを押すとまずビルドが行われるので、
タで動作確認を行いましょう。○
プロジェクトの保存と、エラーがないことも同時に確認が出来ます。 24
Objective-­‐C まとめ ④IBOutletの設定 今のままだとView上に配置されたボタンやラベルを、View Controllerから制御
することができません。そのためにView Controllerにボタンやラベルをアウト
レットする必要があります。 まずXcode左側のShow the Project Navigatorウインドウより、View Controller.hファイルを開きます。@interface部に以下のように記述します。 <IBOutletとIBAction> Xcode側とInterface Builder側をつなぐ架け橋になるのがIBOutletとIBAction
の2つの言葉です。
・ IBOutlet…そのメンバがInterfaceBuilder側で作成したパーツであることを
知らせるために宣言するものです
・ IBAction…そのオブジェクトの外部から見えるメソッドが、 Interface Builder側にあるパーツからのメッセージに対応するためのものであること
を知らせるために付けます。 25
Objective-­‐C まとめ 次にMainstoryboard.storyboardを選択し、View Controller Scene内のView Controllerを右クリック(ctr+クリック)します。するとOutletsとしてさきほ
どView Controller.hに記述した内容が反映されているのが分かります。 26
Objective-­‐C まとめ では実際につなげてみましょう。Outletsに表示されているbtn_guの右側の○を
選択して、View上のぐーボタンとつなげます。これでアウトレットが完了しま
した。残りのボタンやラベルについても同様につなげてください。 27
Objective-­‐C まとめ ⑤プロパティの設定 今度はボタンやラベルにプロパティを設定します。 プロパティの基本的な役割は、他のオブジェクトが自オブジェクトの中にある
変数やオブジェクトへアクセスする時のルールを決定することです。 その変数やオブジェクトが外から変更可能なのか、オブジェクトを外から変更
する場合、外から渡されたオブジェクトをそのまま持つようにするか、 そのコ
ピーをとって持つのかといったこともプロパティで決定します。 ViewController.hに以下のように記述してください。 28
Objective-­‐C まとめ <プロパティのアトリビュートの種類> 種類 オプション 意味 getter=ゲッタ
名 ゲッタメソッド、セッタメソッドを明
setter=セッタ
示的に指定する。 メソッド名指定 名 readonly 読み取り専用 readwrite 読み書き可能(デフォルト値) assign 代入 retain 保持 copy コピー 読み書き属性 値の設定方法 アトミック属性 noatomic アトミック無し プロパティのアトリビュートの宣言例 (nonatomic,assign)…普通の変数
(nonatomic,retain)…自分で使うビューやラベル、配列、ディクショナリー
(nonatomic,copy)…文字列やデータ 29
Objective-­‐C まとめ 次にViewController.mを開きます。@propertyに対応するかたちで、@synthesize
を記述します。これでゲッターとセッターが自動的に生成されます。 プロパティの動きを理解するために、viewDidLoadメソッドにコードを記述し、
ラベルとボタンの表示を変更してみましょう。 30
Objective-­‐C まとめ self.lbl_kekka.text=@”テスト”; self.を変数名の前に付けることで自分のメンバに対してもプロパティのルール
が適用できます。ここではlbl_kekkaラベルのテキスト表示をテストに変更して
います。@””はObjective-CにおけるNSString型の文字列表記です。 self.btn_gu.hidden=YES; btn_guボタンのhiddenをYES、つまりボタンを非表示にします。
シミュレータを実行してみると、ラベル表記が「テスト」に、グーボタンが非
表示になっていることが確認できます。今回は動作確認が目的なので、
viewDidLoadの内容を基にもどしておきましょう。
31
Objective-­‐C まとめ ⑥IBActionの設定 IBActionとは先述のとおり、Interface Builder側にあるパーツからのメッセー
ジに対応するメソッドです。 それではViewController.hにIBActionを宣言しましょう。以下のように記述し
てください。 IBOutletの時と同様に、View Controller SceneのView Controllerを右クリッ
クし、表示されたIBActionの右側の○を対応するボタンと結びつけます。 32
Objective-­‐C まとめ イベントはTouch Up Insideを選択します。これはタッチして指を離した時のイ
ベントです。4つのIBActionをそれぞれ対応するボタンと結びつけます。 <主なイベントの説明> Touch Down…パーツ内に触れた時 Touch Down Repeat…パーツ内で2回以上触れた時 Touch Drag Enter…パーツ内から外へドラックして再び戻ってきた時 Touch Drag Exit…パーツ内から外へドラックされた時 Touch Drag Inside…パーツ内でドラックが行なわれた時 Touch Drag Outside…パーツ内から外へドラックが行なわれた時 Touch Up Inside…タップされた時 Touch Up Outside…タップ動作でパーツの外で離された時 33
Objective-­‐C まとめ つづいてViewController.mに、IBActionの具体的な動作を記述します。まずは
btn_gu_downを次のように記述してみましょう。 34
Objective-­‐C まとめ srand(time(nil));
NSInteger aite;
aite=rand()%3;
ここで乱数を求め、変数aiteには整数の0、1、2のいずれかが代入されます。
それに対応するかたちで、コンピュータにグー、チョキ、パーを割り当ててい
ます。 If文の分岐により、あいこの場合、勝った場合、負けた場合のメッセージや画
面表示を分けています。 btn_tyoki_down、btn_pa_downについてもコーディングしてください。 btn_again_downは以下のようにします。もう一度ゲームを遊ぶときに呼ばれる
アクションなので、すべて初期状態になるようにしています。 これでゲームのロジックは一通り実装できました。シミュレータで動作確認を
してみてください。 35
Objective-­‐C まとめ ⑦ユーザーインターフェースの設定 ゲームの動作は完成しましたので、ユーザーインターフェースを整えていきま
す。今の状態では、起動時の画面にラベルのタイトルがそのまま表示されてし
まっているのでviewDidLoadで内容を変更しましょう。 以下のようにしてラベルのテキストを空白にします。 <View関連の主なメソッド> viewDidLoad…インスタンス化したときに呼ばれる viewWillAppear…View表示直前に呼ばれる viewDidAppear…View表示直後に呼ばれる 今度はボタンに画像を表示するようにしてみましょう。 36
Objective-­‐C まとめ Xcodeのメニューバーより、File→Add Files to “プロジェクト名”で画像フ
ァイルの追加ができます。 Storyboard上のボタンを選択し、インスペクタウインドウより画像を選択しま
す。また、タイプをCustomにすることでボタンの枠が透明になり、画像のみが
奇麗に表示されるようになります。 37
Objective-­‐C まとめ 続いてインスペクタウインドウのサイズタブよりボタンのサイズを90×90に変
更します。他のボタンも同様に設定します。 ラベルに表示していた相手の手も画像で表示するように変更しましょう。
Storyboard上のラベルを削除して、UIImageViewを配置します。 38
Objective-­‐C まとめ Labelを削除して、新しくImageViewを配置したわけですから、コードの修正が
必要になります。 39
Objective-­‐C まとめ さっそく追加したアウトレットを、Storyboardから結びつけておきましょう。
40
Objective-­‐C まとめ ViewController.mも変更します。まずはUIImageをsynthesizeします。 そしてUIImageクラスの変数を3つ宣言します。これはさきほど追加したジャン
ケンアイコンgu.png、ch.png、pa.pngを扱うために使用します。 viewDidLoadでこれらの変数にpng画像へのパスを代入します。
gu_img=[UIImage imageNamed:@"gu.png"];
imageNamedではパスをKeyとしてイメージをキャッシュするので、今回のように
同じ画像を何回も使用する場合に有用です。その代わり、様々な画像を順次表
示するような場合は別の方法を検討するべきでしょう。 41
Objective-­‐C まとめ さきほどまでラベルで表示していた相手の手を、UIImageに変更します。他の箇
所も同じ要領で変更します。 これで全てのコーディング作業が終了です。実際に遊んでみると、きちんとし
たゲームになっているはずです。 42
Objective-­‐C まとめ ⑧アプリケーションバンドルの設定 iOSアフリケーションをビルドすると、Xcodeはアフリケーションをバンドルと
してハッケーシ化します。バンドルとは、関連のあるリソースを1つの場所に集
めた、ファイルシステム上のティレクトリです。iOSアフリケーションのバンド
ルには、アフリケーションの実行可能ファイルと支援用リソースファイルが含
まれています。 ここではアプリ起動時に表示される”Default.png”および、アイコン画
像”Icon.png”の設定をしてみましょう。 まずはアプリ起動時の画像です。320×480のDefault.pngという画像を用意し、
これをグーボタンなどの画像を追加したのと同じ要領でプロジェクトに追加す
るだけです。これでアプリを起動した際に最初にこの画像が読み込まれます。 つづいてアイコン画像を作成します。57×57のIcon.pngという画像をプロジェ
クトに追加するだけです。これでアプリのアイコンが作成出来ました。 <起動時画像とアイコン画像> ・Defult.png (320×480)…アプリケーションの起動処理中、このファイルを
一時的な背景として使用します。ユーザインターフェイスの表示かできる状態
になり次第、削除されます。
・[email protected] (640×960)…Retinaディスプレイでの表示用です。
・Icon.png (57×57)…デバイスのホーム(Home)画面でアプリケーションを表
示するために使用します。
・[email protected] (114×114)…Retinaディスプレイでの表示用です。
43
Objective-­‐C まとめ いずれもXcodeのTARGETから設定の変更や確認をすることができます。 44
Objective-­‐C まとめ 6.用語のおさらい <Automatic Reference Counting (ARC)> 効率がよく的確なメモリ管理も、iOSアプリケーションにとっては重要で
す。同程度のデスクトップ コンピュータに比べてメモリ容量に制約があ
るので、不要なオブジェクトは積極的に削除し、生成も実際に必要になる
時点まで遅延させる、などの工夫が必要です。コンパイラの自動参照カウ
ント (ARC、Automatic Reference Counting)機能を利用すれば、効率的な
メモリ管理機能を組み込むことができます。ガベージコレクションに似て
いますが、処理性能を損なわない方法です。ARCを使わない場合は、明示
的にオブジェクトを獲得、解放し、独自にメモリを管理しなければなりま
せん。 <ストーリーボード> ストーリーボードを使えば、ユーザインターフェイスのビューや View Controller、およびその遷移を俯瞰でき、設計工程が分かりやすくなり
ます。iOS5以降で利用でき、新しく作成するプロジェクトでは最初から有
効になっています。ただし、旧iOSでも動作するアプリケーションを開発
する場合、ストーリーボードは使えないので、従来通りnibファイルを使
ってください。 45
Objective-­‐C まとめ <アプリケーションデリゲートメソッド> ●
application:didFinishLaunchingWithOptions: - アプリケーション起動後、最初
に実行する処理を記述します。
●
applicationDidBecomeActive: - フォアグラウンド状態になったときの実行
準備処理を記述します。
●
applicationWillResignActive: - フォアグラウンド状態から抜けようとして
いる際に呼び出されます。アプリケーションを一時停止状態にするための
処理を記述します。
●
applicationDidEnterBackground: - バックグラウンド状態で動作しており、
いつでも一時停止状態になりうることを表します。
●
applicationWillEnterForeground: - バックグラウンド状態から抜けつつある
けれども、まだアクティブにはなっていないことを表します。
●
applicationWillTerminate: - アプリケーションがもうすぐ停止することを表
します。一時停止状態であれば、このメソッドは呼び出されません。
46