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

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

on

  • 997 views

https://www.facebook.com/iDevNagoya

https://www.facebook.com/iDevNagoya

Statistics

Views

Total Views
997
Views on SlideShare
969
Embed Views
28

Actions

Likes
1
Downloads
5
Comments
0

15 Embeds 28

https://www.facebook.com 14
https://m.facebook.com&_=1377703318307 HTTP 1
https://m.facebook.com&_=1378662138535 HTTP 1
https://m.facebook.com&_=1377961173177 HTTP 1
https://m.facebook.com&_=1377961079742 HTTP 1
https://m.facebook.com&_=1377869443046 HTTP 1
https://m.facebook.com&_=1377862415385 HTTP 1
https://m.facebook.com&_=1377773203981 HTTP 1
https://m.facebook.com&_=1377758891821 HTTP 1
https://m.facebook.com&_=1377759945640 HTTP 1
https://m.facebook.com&_=1377730501204 HTTP 1
https://m.facebook.com&_=1377724641902 HTTP 1
https://m.facebook.com&_=1377724004344 HTTP 1
https://m.facebook.com&_=1377703311524 HTTP 1
https://m.facebook.com&_=1378662148723 HTTP 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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