第19回 ビギナー勉強会のサルでき補足資料( iphoneアプリ開発超入門 |...
DESCRIPTION
https://www.facebook.com/iDevNagoyaTRANSCRIPT
自己紹介
本名:服部貴俊(はっとりたかとし)
名古屋市南区在住
似てる有名人トム・クルーズ、ディカプリオ等※
twitter : @tatsujinbomber
facebook :「服部貴俊」で登録してます。 よろしくどうぞ。
2※ すいません。ウソつきました。
教科書はいつもの
UI設計ではInterface Builder使わず、コードでバリバリ作る 硬派な本を使って勉強です。
項目は独立。
どこから手を付けてもOK。
毎回2~3テーマ進めています。
3
今日のお題はchapter3-15タブバーを作ろう
モヤモヤPointの整理クラスってなに?
chapter3-16テーブルを作ろう
所要時間30分
4
所要時間30分
このあたりで一度
所要時間30分
5
\ 教科書をみてね /
chapter3-15 タブバーを作ろう
今回、準備不足か?
モヤモヤPointの整理
サルでき本も半分を終えてここで一度
7
でも心配要りません。物事のすべては、始まりがあります。
ここは歴史を知るのが一番! 順に見ていきましょう(参考書と経験で、適当にいきます)。
「じゃー、オブジェクトってなに?」「いきなりオブジェクト指向プログラミングって無謀?」ってなりがち。もっとも覚えることが多いのは事実。
一言で「クラスはオブジェクトの設計図」です※
クラスってなに?モヤモヤPoint
※ Apple公式ドキュメント ProgrammingWithObjectiveC.pdf 参照 8
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
10
時代は構造化プログラミングへ
・順次進行(プログラムは上から下へ)・条件分岐(if文など)・繰り返し (forなど)
「正しく動作するプログラムを作成するためには、 わかりやすい構造にすることが重要」 by ダイクストラ(1930-2002)
昔は、メモリや処理速度の制約で、コンパクトなプログラムが必須。Goto文で、好き勝手に飛ぶとか。
結果、プログラムの可読性が低下。理解しずらくなる。スパゲッティコードといった言葉もあり。
「これだけでやりませんか」と提唱
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Goto
Goto
Goto
Goto
・Goto文は極力使わない(複雑な入れ子ループから一気に抜ける場合のみ使う)
イメージ
・もちろん、共通の処理はサブルーチンで。
・順次進行 ・条件分岐(if文)
11
処理1
処理2
処理n
・繰り返し (for文)
処理1
判断
処理2
処理1
判断YES
NO
・サブルーチン (関数)
※ 条件分岐と繰り返しで任意の論理が表現できることが“証明”されているようです。
関数1
関数2
メインの処理 機能的な塊を関数にしたり
何度も使う機能も関数にすると
書く量も減って便利
call
call
☆結果的にコードはずいぶん分かりやすくなりました(手抜き)☆
関数2
ローカル変数
12
・グローバル変数問題
関数1
処理
call
call
それでも残った課題あり※
ローカル変数
グローバル変数A
関数の中だけで使う変数はローカル変数で十分
(抜ければ消滅)
グローバル変数A
グローバル変数A
関数を抜けても保持したい情報は、関数の外側に定義
→どこからでも参照可能
callどこからでも
見えすぎちゃって問題!プログラムが巨大になると、グローバル変数の影響範囲を把握するのが大変!
でも
※ 上記に加えて関数ライブラリでは、後述のクラスに比べて機能が貧弱なため、 関数(部品)の再利用に限界が見えていたようです。
13
ついにクラスの登場です | 変数も関数もいっしょくたに
クラス2クラス1インスタンス変数A
インスタンス変数B
グローバル変数A
グローバル変数B
関数1メソッド2
関数3メソッド4
関数5メソッド6
メソッド1
メソッド3
メソッド5
関数2
関数4
関数6
まとめる
散在してる部品群 関連パーツで括ればスッキリ(カプセル化)※
もちろん、クラス内の各メソッドからインスタンス変数にアクセス可能
※ ここから関数はメソッドに、グローバル変数はインスタンス変数に名前が変わります。 また、別クラスであれば、同種の変数やメソッドは同じ名前にしても大丈夫。 正直名前考えるのもめんどいし、「同じ類の処理は同じメッセージを使えるべき」という 省エネ指向のポリモーフィズムに繋がります。
同じ名前でもOK!
同じ名前でもOK!
アクセスOK!
14
クラス1
インスタンス変数A
メソッド1 メソッド3 メソッド5
もうちょっと詳しく・・・クラスとインスタンス
インスタンス変数B
インスタンス変数C
処理
公開 公開 非公開
公開 非公開 非公開
ローカル変数
ローカル変数
ローカル変数
クラスを使用する場合は、そのクラスに必要なメモリの領域を確保して使います。それをインスタンス(実体)とかオブジェクトとか言います。さらに、何個でも大量に生成できます。
クラスは「変数+メソッド」の雛形です。インスタンス変数や、メソッドは、クラスの外から見て、必要なものだけ公開することができます。
必要ないものは、見えない化をするのが大事!
クラスから生成したインスタンス
UILabel *Label = [[UILabel alloc] initWithFrame:CGRectMake(,,,)];UILabel型のポインタ変数Label に、UILabelクラスのメモリ領域を確保してその番地をセットします。
alloc + init
ラベルの生成でいうと、
もうちょっと詳しく・・・ クラスとメモリクラスは、メモリの使い方に特徴があります。ヒープ領域に確保したインスタンスを、不要になった時点で適切に解放しないと、タイミングを逃して、何からも参照されないインスタンスができちゃいます。 漏れる漏れると、みんなが騒いでるのはこれのこと。メモリリーク※です。発生すると、ひもが切れた宇宙ゴミのように有害。ケア必要です。
ヒープ領域スタック領域
ポインタ変数
ポインタ変数
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
インスタンスインスタンス
インスタンス
インスタンス
インスタンス
インスタンス
※ 赤色のインスタンスは、ポインタ変数から追跡できません(制御不能)。 15
16
継承ってなに? | クラス定義の重複を排除する仕様いろんなクラスを1から書いたのでは効率悪いので、クラスの共通部分をまとめておいて、流用して省エネしてる言語仕様
サブクラス1
スーパークラスの変数とメソッド全部※2
固有の変数とメソッド
スーパークラス
サブクラス2
スーパークラスの変数とメソッド全部
固有の変数とメソッド
スーパークラスを継承し、+αのコード追加でいろんなサブクラスを定義できます。
継承※1 継承
※1 矢印の方向は「スーパークラスを参照」の意味で、そっち向きに書きます。※2 同名のメソッドを再定義(オーバーライド)して、都合良く使うことができます。 これも呼び出し側の修正なしに、振る舞いを変更できます→省エネのポリモーフィズム。
17
Objective-Cのクラス定義を再確認
☆クラスのインターフェース部 | ヘッダーファイル (~.h) に記述します
ヘッダーファイル(~.h)と実装ファイル(~.m)でワンセットです。
@interface クラス名 : スーパークラス <プロトコル>{ インスタンス変数; インスタンス変数; ・・・}
-(戻り値の型)メソッド名;-(戻り値の型)メソッド名; ・・・ @end
「カスタムメソッドの宣言」。 スーパークラスのメソッドは 定義部に宣言不要 (スーパークラスで宣言済み)。
「クラスが保持するインスタンス 変数は{ }の中に記述します。
18
@implementation クラス名
@end
-(戻り値の型)メソッド名{ 機能を書く; ・・・}
-(戻り値の型)メソッド名{ 機能を書く; ・・・}
メソッド内のみで必要な変数はこの{ }中に定義。
文(ステートメント)の区切りは、改行ではなく、セミコロン;です。
つまり一行にダラダラ書くこともできます。
☆クラスの実装部 | ~.mファイルに記述します
この枠がひとつのメソッド。
19
①Storyboardファイルを選択
②Labelをドラッグ
③ここでも、Viewの前面に、Labelがあるのが確認できます。
UILabelクラスの継承関係を確認してみます
20
②これ選択するか
UILabelのヘッダーファイル(UILabel.h)を開きます。
①Label指定して
②’クイックヘルプインスペクターから
これ選択
21
UILabelのヘッダーファイル(UILabel.h)にジャンプできました。
UILabelクラスの宣言文が見えます。 UIViewがスーパークラスで、それを継承しています。
UILabelクラスは、UIKitフレームワークにあることが分かります。
22
UILabelクラスのスーパクラス一覧が分かります。試しに、UIViewを選択すると、
23
UIViewのヘッダーファイル(UIView.h)にジャンプできました。
ジャンプバーと言います。ちなみに、ここを
クリックすると・・・
ヘッダーで定義されたクラス一覧と、それぞれのプロパティ、メソッドが分かります。
24
ルートクラスのNSObjectも同様に確認できます。
毎度おなじみのallocがこんな所に。
どっかで見た、initがこんな所に。
25
サブクラスにもジャンプできます。
UIViewのサブクラス一覧を表示してみた。
UILabelもちゃんと入ってました。
26
ジャンプの別の技です。
気になるクラスを見つけたら・・・(ショートカットは、cmd + クリック)
インターフェースにジャンプ
27
まとめると以下の継承の連鎖によってUILabelクラスが定義されています。
NSObject
UIView
UILabel
ルートクラスタッチ・シェイクなどのイベントに応答するクラス
ビューのクラス
文字列表示のクラス
UIResponder
UILabelのインスタンスは、UILabel固有の機能だけでなく、その上位にある各スーパークラスから機能を継承しています。
クラスにどのような機能があるかを調べる際、継承の連鎖があることを頭に入れておくことが重要です。
あるクラスのインターフェイスやリファレンス資料に探している機能が見つからなくても、スーパークラスを順次たどっていけば、
定義や解説が見つかるかもしれません。
28
なお、継承関係はアトリビュートインスペクター※でも少し分かります。
※ 配置したクラス部品の見た目などの情報を定義する場所。
順番に並んでます↓
継承
UILabelに固有の設定情報
UIViewに固有の設定情報
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
30
ここで疑問が | 標準クラスの実装って見えなくていいの?UIKitのライブラリは、ヘッダーファイルしか見えません。
実装部のソースコードは確認できません。 インターフェースだけ公開して中身を隠す ポリシーになってます。
コンピュータの仕組みを知らなくても、 パソコンが操作できます。 車の構造を知らなくても運転できます。 操作方法(インターフェース)さえ分かれば、 中身がどうなってるかは、知る必要がありません。
ヘッダーファイルは、説明の少ない米国製品の 取説みたいなもの。 サルでき本を読んで、使い方を勉強します。
変数とか、メソッドのリストは分かるけど・・・
それでいいの?
でもどうすれば?
一旦まとめ
こむずかしいオブジェクト指向のアイディアも、最初から急に 登場したわけでないようです。
最初は、Cocoa Touchクラス群の深い継承関係や各クラスの役割に、 「こんなもん覚えられるか!※」って思いますが、書いたり確認 したりで顔馴染みのクラスが多くなってくると、徐々に脳みそに 入ってきます。
結局、アプリの部品がクラスの集合で成り立っている以上、 覚悟を決めて使いこなすしかありません。
※ もちろんリファレンスは都度参照のこと。 でも詰め込みから創造性は生まれます。たぶんね ^ ^! 31
32
\ 教科書をみてね /
一緒にやりましょう(^_^メ)
chapter3-16 テーブルを作ろう
今回、準備不足か?
ありがとうございました。また、次回もお付き合いください。