34

第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

Embed Size (px)

DESCRIPTION

https://www.facebook.com/iDevNagoya

Citation preview

Page 1: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)
Page 2: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

自己紹介

本名:服部貴俊(はっとりたかとし)

名古屋市南区在住

似てる有名人トム・クルーズ、ディカプリオ等※

twitter : @tatsujinbomber

facebook :「服部貴俊」で登録してます。      よろしくどうぞ。

2※ すいません。ウソつきました。

Page 3: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

教科書はいつもの

UI設計ではInterface Builder使わず、コードでバリバリ作る 硬派な本を使って勉強です。

項目は独立。

どこから手を付けてもOK。

毎回2~3テーマ進めています。

3

Page 4: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

今日のお題はchapter3-15タブバーを作ろう

モヤモヤPointの整理クラスってなに?

chapter3-16テーブルを作ろう

所要時間30分

4

所要時間30分

このあたりで一度

所要時間30分

Page 5: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

5

\ 教科書をみてね /

chapter3-15 タブバーを作ろう

Page 6: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

今回、準備不足か?

Page 7: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

モヤモヤPointの整理

サルでき本も半分を終えてここで一度

7

Page 8: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

でも心配要りません。物事のすべては、始まりがあります。

ここは歴史を知るのが一番! 順に見ていきましょう(参考書と経験で、適当にいきます)。

「じゃー、オブジェクトってなに?」「いきなりオブジェクト指向プログラミングって無謀?」ってなりがち。もっとも覚えることが多いのは事実。

一言で「クラスはオブジェクトの設計図」です※

クラスってなに?モヤモヤPoint

※ Apple公式ドキュメント ProgrammingWithObjectiveC.pdf 参照 8

Page 9: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

9※「オブジェクト指向でなぜ作るのか」平澤 章 (著) 参考。’06年に買った本。  今をときめく”Objective-C”のワードは、参考文献の紹介部に一瞬だけ登場します。

・機械語

・アセンブリ言語登場

・FORTRAN登場

1940年代

1949年

1957年

プログラミング言語の歴史※

マイクロプロセッサーが解釈できるのは機械語だけ

A10010 8B160210 01D0 A10410

MOV AX, X MOV DX, Y ADD AX, DX MOV Z, AX

Z = X + Y

数式そのままで分かりやすい。品質・生産性も向上➚

数字の命令を記号に割り当て

人が読みやすいコードを機械語に変換するのが言語。但し、機械語直書き同等の実行効率は無いようです。

数字の羅列x86ARM

Page 10: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

10

時代は構造化プログラミングへ

・順次進行(プログラムは上から下へ)・条件分岐(if文など)・繰り返し (forなど)

「正しく動作するプログラムを作成するためには、 わかりやすい構造にすることが重要」 by ダイクストラ(1930-2002)

昔は、メモリや処理速度の制約で、コンパクトなプログラムが必須。Goto文で、好き勝手に飛ぶとか。

結果、プログラムの可読性が低下。理解しずらくなる。スパゲッティコードといった言葉もあり。

「これだけでやりませんか」と提唱

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

Goto

Goto

Goto

Goto

・Goto文は極力使わない(複雑な入れ子ループから一気に抜ける場合のみ使う)

イメージ

・もちろん、共通の処理はサブルーチンで。

Page 11: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

・順次進行 ・条件分岐(if文)

11

処理1

処理2

処理n

・繰り返し (for文)

処理1

判断

処理2

処理1

判断YES

NO

・サブルーチン (関数)

※ 条件分岐と繰り返しで任意の論理が表現できることが“証明”されているようです。

関数1

関数2

メインの処理 機能的な塊を関数にしたり

何度も使う機能も関数にすると

書く量も減って便利

call

call

☆結果的にコードはずいぶん分かりやすくなりました(手抜き)☆

Page 12: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

関数2

ローカル変数

12

・グローバル変数問題

関数1

処理

call

call

それでも残った課題あり※

ローカル変数

グローバル変数A

関数の中だけで使う変数はローカル変数で十分

(抜ければ消滅)

グローバル変数A

グローバル変数A

関数を抜けても保持したい情報は、関数の外側に定義

→どこからでも参照可能

callどこからでも

見えすぎちゃって問題!プログラムが巨大になると、グローバル変数の影響範囲を把握するのが大変!

でも

※ 上記に加えて関数ライブラリでは、後述のクラスに比べて機能が貧弱なため、 関数(部品)の再利用に限界が見えていたようです。

Page 13: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

13

ついにクラスの登場です | 変数も関数もいっしょくたに

クラス2クラス1インスタンス変数A

インスタンス変数B

グローバル変数A

グローバル変数B

関数1メソッド2

関数3メソッド4

関数5メソッド6

メソッド1

メソッド3

メソッド5

関数2

関数4

関数6

まとめる

散在してる部品群 関連パーツで括ればスッキリ(カプセル化)※

もちろん、クラス内の各メソッドからインスタンス変数にアクセス可能

※ ここから関数はメソッドに、グローバル変数はインスタンス変数に名前が変わります。 また、別クラスであれば、同種の変数やメソッドは同じ名前にしても大丈夫。 正直名前考えるのもめんどいし、「同じ類の処理は同じメッセージを使えるべき」という 省エネ指向のポリモーフィズムに繋がります。

同じ名前でもOK!

同じ名前でもOK!

アクセスOK!

Page 14: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

14

クラス1

インスタンス変数A

メソッド1 メソッド3 メソッド5

もうちょっと詳しく・・・クラスとインスタンス

インスタンス変数B

インスタンス変数C

処理

公開 公開 非公開

公開 非公開 非公開

ローカル変数

ローカル変数

ローカル変数

クラスを使用する場合は、そのクラスに必要なメモリの領域を確保して使います。それをインスタンス(実体)とかオブジェクトとか言います。さらに、何個でも大量に生成できます。

クラスは「変数+メソッド」の雛形です。インスタンス変数や、メソッドは、クラスの外から見て、必要なものだけ公開することができます。

必要ないものは、見えない化をするのが大事!

クラスから生成したインスタンス

UILabel *Label = [[UILabel alloc] initWithFrame:CGRectMake(,,,)];UILabel型のポインタ変数Label に、UILabelクラスのメモリ領域を確保してその番地をセットします。

alloc + init

ラベルの生成でいうと、

Page 15: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

もうちょっと詳しく・・・ クラスとメモリクラスは、メモリの使い方に特徴があります。ヒープ領域に確保したインスタンスを、不要になった時点で適切に解放しないと、タイミングを逃して、何からも参照されないインスタンスができちゃいます。 漏れる漏れると、みんなが騒いでるのはこれのこと。メモリリーク※です。発生すると、ひもが切れた宇宙ゴミのように有害。ケア必要です。

ヒープ領域スタック領域

ポインタ変数

ポインタ変数

インスタンス

インスタンス

インスタンス

インスタンス

インスタンス

インスタンスインスタンス

インスタンス

インスタンス

インスタンス

インスタンス

※ 赤色のインスタンスは、ポインタ変数から追跡できません(制御不能)。 15

Page 16: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

16

継承ってなに? | クラス定義の重複を排除する仕様いろんなクラスを1から書いたのでは効率悪いので、クラスの共通部分をまとめておいて、流用して省エネしてる言語仕様

サブクラス1

スーパークラスの変数とメソッド全部※2

固有の変数とメソッド

スーパークラス

サブクラス2

スーパークラスの変数とメソッド全部

固有の変数とメソッド

スーパークラスを継承し、+αのコード追加でいろんなサブクラスを定義できます。

継承※1 継承

※1 矢印の方向は「スーパークラスを参照」の意味で、そっち向きに書きます。※2 同名のメソッドを再定義(オーバーライド)して、都合良く使うことができます。  これも呼び出し側の修正なしに、振る舞いを変更できます→省エネのポリモーフィズム。

Page 17: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

17

Objective-Cのクラス定義を再確認

☆クラスのインターフェース部 | ヘッダーファイル (~.h) に記述します

ヘッダーファイル(~.h)と実装ファイル(~.m)でワンセットです。

@interface クラス名 : スーパークラス <プロトコル>{ インスタンス変数; インスタンス変数; ・・・}

-(戻り値の型)メソッド名;-(戻り値の型)メソッド名; ・・・ @end

「カスタムメソッドの宣言」。 スーパークラスのメソッドは 定義部に宣言不要 (スーパークラスで宣言済み)。

「クラスが保持するインスタンス 変数は{ }の中に記述します。

Page 18: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

18

@implementation クラス名

@end

-(戻り値の型)メソッド名{ 機能を書く;   ・・・}

-(戻り値の型)メソッド名{ 機能を書く;   ・・・}

メソッド内のみで必要な変数はこの{ }中に定義。

文(ステートメント)の区切りは、改行ではなく、セミコロン;です。

つまり一行にダラダラ書くこともできます。

☆クラスの実装部 | ~.mファイルに記述します

この枠がひとつのメソッド。

Page 19: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

19

①Storyboardファイルを選択

②Labelをドラッグ

③ここでも、Viewの前面に、Labelがあるのが確認できます。

UILabelクラスの継承関係を確認してみます

Page 20: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

20

②これ選択するか

UILabelのヘッダーファイル(UILabel.h)を開きます。

①Label指定して

②’クイックヘルプインスペクターから

これ選択

Page 21: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

21

UILabelのヘッダーファイル(UILabel.h)にジャンプできました。

UILabelクラスの宣言文が見えます。 UIViewがスーパークラスで、それを継承しています。

UILabelクラスは、UIKitフレームワークにあることが分かります。

Page 22: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

22

UILabelクラスのスーパクラス一覧が分かります。試しに、UIViewを選択すると、

Page 23: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

23

UIViewのヘッダーファイル(UIView.h)にジャンプできました。

ジャンプバーと言います。ちなみに、ここを

クリックすると・・・

ヘッダーで定義されたクラス一覧と、それぞれのプロパティ、メソッドが分かります。

Page 24: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

24

ルートクラスのNSObjectも同様に確認できます。

毎度おなじみのallocがこんな所に。

どっかで見た、initがこんな所に。

Page 25: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

25

サブクラスにもジャンプできます。

UIViewのサブクラス一覧を表示してみた。

UILabelもちゃんと入ってました。

Page 26: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

26

ジャンプの別の技です。

気になるクラスを見つけたら・・・(ショートカットは、cmd + クリック)

インターフェースにジャンプ

Page 27: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

27

まとめると以下の継承の連鎖によってUILabelクラスが定義されています。

NSObject

UIView

UILabel

ルートクラスタッチ・シェイクなどのイベントに応答するクラス

ビューのクラス

文字列表示のクラス

UIResponder

UILabelのインスタンスは、UILabel固有の機能だけでなく、その上位にある各スーパークラスから機能を継承しています。

クラスにどのような機能があるかを調べる際、継承の連鎖があることを頭に入れておくことが重要です。

あるクラスのインターフェイスやリファレンス資料に探している機能が見つからなくても、スーパークラスを順次たどっていけば、

定義や解説が見つかるかもしれません。

Page 28: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

28

なお、継承関係はアトリビュートインスペクター※でも少し分かります。

※ 配置したクラス部品の見た目などの情報を定義する場所。

順番に並んでます↓

継承

UILabelに固有の設定情報

UIViewに固有の設定情報

Page 29: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

UIViewのサブクラスの図※ここだけとっても、こんな感じでUI部品(クラス)が派生しています。ほんとにそうなってるか、一度ご確認を。赤色がサルでき本で扱うクラスです。

※ 「プロの力を身につけるiPhone/iPadアプリケーション開発の教科書」参考。  丸写しじゃないと、線重ねず書くのも困難なほど、幾多にも継承してます。

UIView

UIImageViewUILabel

UITableViewCell

UIScrollView

UIControl

UIStepperUISliderUISwitch

UITextField UISegmentedControl

UIDatePicker

UIActionSheet

UITabBar

UIToolbar

UINavigationBar

UISearchBar

UIWindow

UIRefreshControl

UIButton

UIPageControl

UIAlertView

UIActivityIndicatorView

UITextField

UIProgressViewUITableViewHeaderFooterView

UICollectionViewCell

UITableView

UIWebView

UIPickerViewUITextView

UICollectionView

→ この矢印はプロパティとして保有

29

Page 30: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

30

ここで疑問が | 標準クラスの実装って見えなくていいの?UIKitのライブラリは、ヘッダーファイルしか見えません。

実装部のソースコードは確認できません。 インターフェースだけ公開して中身を隠す ポリシーになってます。

コンピュータの仕組みを知らなくても、 パソコンが操作できます。 車の構造を知らなくても運転できます。 操作方法(インターフェース)さえ分かれば、 中身がどうなってるかは、知る必要がありません。

ヘッダーファイルは、説明の少ない米国製品の 取説みたいなもの。 サルでき本を読んで、使い方を勉強します。

変数とか、メソッドのリストは分かるけど・・・

それでいいの?

でもどうすれば?

Page 31: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

一旦まとめ

こむずかしいオブジェクト指向のアイディアも、最初から急に 登場したわけでないようです。

最初は、Cocoa Touchクラス群の深い継承関係や各クラスの役割に、 「こんなもん覚えられるか!※」って思いますが、書いたり確認 したりで顔馴染みのクラスが多くなってくると、徐々に脳みそに 入ってきます。

結局、アプリの部品がクラスの集合で成り立っている以上、 覚悟を決めて使いこなすしかありません。

※ もちろんリファレンスは都度参照のこと。  でも詰め込みから創造性は生まれます。たぶんね ^ ^! 31

Page 32: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

32

\ 教科書をみてね /

一緒にやりましょう(^_^メ)

chapter3-16 テーブルを作ろう

Page 33: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

今回、準備不足か?

Page 34: 第19回 ビギナー勉強会のサルでき補足資料( iPhoneアプリ開発超入門 | クラスってなに?)

ありがとうございました。また、次回もお付き合いください。