SlideShare a Scribd company logo
1 of 34
Download to read offline
自己紹介
本名:服部貴俊(はっとりたかとし)
名古屋市南区在住
似てる有名人
トム・クルーズ、ディカプリオ等※
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
UIImageView
UILabel
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 テーブルを作ろう
今回、準備不足か?
ありがとうございました。
また、次回もお付き合いください。

More Related Content

More from Takatoshi Hattori

第26回名古屋iPhoneアプリ開発勉強会アンケート結果
第26回名古屋iPhoneアプリ開発勉強会アンケート結果第26回名古屋iPhoneアプリ開発勉強会アンケート結果
第26回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第21回名古屋iPhoneアプリ開発勉強会アンケート結果
第21回名古屋iPhoneアプリ開発勉強会アンケート結果第21回名古屋iPhoneアプリ開発勉強会アンケート結果
第21回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第24回名古屋iPhoneアプリ開発勉強会アンケート結果
第24回名古屋iPhoneアプリ開発勉強会アンケート結果第24回名古屋iPhoneアプリ開発勉強会アンケート結果
第24回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第22回名古屋iPhoneアプリ開発勉強会アンケート結果
第22回名古屋iPhoneアプリ開発勉強会アンケート結果第22回名古屋iPhoneアプリ開発勉強会アンケート結果
第22回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第20回名古屋iPhoneアプリ開発勉強会アンケート結果
第20回名古屋iPhoneアプリ開発勉強会アンケート結果第20回名古屋iPhoneアプリ開発勉強会アンケート結果
第20回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第19回名古屋iPhoneアプリ開発勉強会アンケート結果
第19回名古屋iPhoneアプリ開発勉強会アンケート結果第19回名古屋iPhoneアプリ開発勉強会アンケート結果
第19回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第17回名古屋iPhoneアプリ開発勉強会アンケート結果
第17回名古屋iPhoneアプリ開発勉強会アンケート結果第17回名古屋iPhoneアプリ開発勉強会アンケート結果
第17回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第16回名古屋iPhoneアプリ開発勉強会アンケート結果
第16回名古屋iPhoneアプリ開発勉強会アンケート結果第16回名古屋iPhoneアプリ開発勉強会アンケート結果
第16回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第18回名古屋iPhoneアプリ開発勉強会アンケート結果
第18回名古屋iPhoneアプリ開発勉強会アンケート結果第18回名古屋iPhoneアプリ開発勉強会アンケート結果
第18回名古屋iPhoneアプリ開発勉強会アンケート結果Takatoshi Hattori
 
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)Takatoshi Hattori
 

More from Takatoshi Hattori (10)

第26回名古屋iPhoneアプリ開発勉強会アンケート結果
第26回名古屋iPhoneアプリ開発勉強会アンケート結果第26回名古屋iPhoneアプリ開発勉強会アンケート結果
第26回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第21回名古屋iPhoneアプリ開発勉強会アンケート結果
第21回名古屋iPhoneアプリ開発勉強会アンケート結果第21回名古屋iPhoneアプリ開発勉強会アンケート結果
第21回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第24回名古屋iPhoneアプリ開発勉強会アンケート結果
第24回名古屋iPhoneアプリ開発勉強会アンケート結果第24回名古屋iPhoneアプリ開発勉強会アンケート結果
第24回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第22回名古屋iPhoneアプリ開発勉強会アンケート結果
第22回名古屋iPhoneアプリ開発勉強会アンケート結果第22回名古屋iPhoneアプリ開発勉強会アンケート結果
第22回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第20回名古屋iPhoneアプリ開発勉強会アンケート結果
第20回名古屋iPhoneアプリ開発勉強会アンケート結果第20回名古屋iPhoneアプリ開発勉強会アンケート結果
第20回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第19回名古屋iPhoneアプリ開発勉強会アンケート結果
第19回名古屋iPhoneアプリ開発勉強会アンケート結果第19回名古屋iPhoneアプリ開発勉強会アンケート結果
第19回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第17回名古屋iPhoneアプリ開発勉強会アンケート結果
第17回名古屋iPhoneアプリ開発勉強会アンケート結果第17回名古屋iPhoneアプリ開発勉強会アンケート結果
第17回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第16回名古屋iPhoneアプリ開発勉強会アンケート結果
第16回名古屋iPhoneアプリ開発勉強会アンケート結果第16回名古屋iPhoneアプリ開発勉強会アンケート結果
第16回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第18回名古屋iPhoneアプリ開発勉強会アンケート結果
第18回名古屋iPhoneアプリ開発勉強会アンケート結果第18回名古屋iPhoneアプリ開発勉強会アンケート結果
第18回名古屋iPhoneアプリ開発勉強会アンケート結果
 
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)
第18回 ビギナー勉強会のサルでき補足資料(iPhoneアプリ開発超入門)
 

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