woshidan's blog

そんなことよりコードにダイブ。

mixi iOS Training 第一回分メモ

授業の内容をブログに書いて良いよと言われたので、とりあえず、内容に関するメモ。 次も行けるか分からないので、次回分は存在しないかもしれない。

参考にしたのは、

0.1 iOSについて · mixi-inc/iOSTraining Wiki · GitHub

0.2 Xcode最初のステップ · mixi-inc/iOSTraining Wiki · GitHub

1.1 Objective C の基礎 · mixi-inc/iOSTraining Wiki · GitHub

iOS SDKで始めるObjective-C入門(7):Objective-Cのクラスやプロパティ、特徴的なメソッドの使い方 (3/3) - @IT

内容

  • 講義内容(主に予習メモ)
  • 授業の様子について

講義内容(主に予習メモ)

0.1 iOSについて

iOSとは

iPhoneアプリではなく、Appleの作っている携帯やらパソコンやらのOSのことだから。
iOSアプリケーションはWebアプリケーションがChromeとかのブラウザがサーバから配信されたソースコードを解読してPC上で動かすんじゃなくて、
Mac系のパソコンやスマートフォンの中にバイナリ入れて動かすから。Windowsアプリケーションみたいなものだから。

Framework

上の方のレイヤほど抽象化されていて、滅多に出てこない実装をしたかったり、動作を早くするためにOSのことを意識したかったりしたら下の層のコードを書くんだと思う(小並感)

把握しておくとAPIを調べるときとかに便利そう

Cocoa Touchレイヤー

一般的なアプリを作るために必要な機能を簡単に書くための関数等が入ってるフレームワークが主な層

UIKit

ボタン配置して、ボタンのイベントリスナをセットして、ということをやりそう。大体使うのはこれとMediaのAssets Library周りな気がした。

MapKit

地図を使いたいときに使う

GameKit

GameCenter(アップルが提供するオンラインマルチプレイヤーソーシャルゲームネットワーク)の機能を使うための機能を提供。
……アップルが用意したオンラインマルチプレイ用ネットワークがあるらしいので、それを使いたかったら使う。

フレームワークとはいわないらしいのですが、

GestureRecognizer

ユーザのタップ等の操作を検出する

ApplePushNotification

いわゆるPush通知。

拡張機能(Extension)

別のアプリケーションの機能を利用したいときに使う。
例えば、Safariで見ているWebページのURLを別のアプリ経由で投稿、とか書いてあった例だけど、まだよく分からない感じかも。

Mediaレイヤ

画像、音声、動画などのマルチメディアに関する機能を提供。

Assets Library

写真(Photos)アプリケーションで管理されている写真やビデオにアクセスする機能を提供。写真の読み込みや保存が可能。

AV Foundation

オーディオ、ビデオの再生、録音、録画、管理を行うクラス群。

Core Graphics

ピクセルベースでなくてベクトルベースで2D画像を描画したいときに使うフレームワーク

GLKit

OpenGL ESの開発を行うためのObjective-Cベースのクラス群です。
写真系アプリの画像加工とかに使うのかしら。

CoreServicesレイヤ

機能にあわせて抽象化(?)された命令がならんだフレームワークCocoa TouchレイヤのUIKitだとしたら、ここはC言語Objective-Cといった言語をそのままいじるためのレイヤといった印象。

Blocks

クロージャや無名関数として紹介されたが、クロージャの使い方に付いてぴんと来なかったので、クロージャについて復習をした方がいいことがよく分かった。

Grand Central Dispatch

タスクの実行管理をBSDレベルで(BSDはプロセス間通信のプロトコルなので、プロセス間で通信を行うレベルで)行う機能で非同期プログラムを行うときに利用する。
たぶんだけど、サーバからデータが届いたら反映の処理を優先して行うように割り込ませる、とか、そういう。

In-App Purchase

AppStoreにひもづけられたコンテンツの購入を行うための機能。課金とかしたいときに見るらしい。
実際使用する時は、In-App PurchaseをStoreKitを利用する。

CF Network

ネットワーク通信を行うための機能。実際に処理を行う時は、この機能をそのまま使うのではなく、CoreFoundationに含まれるクラスを通じて操作する。

CoreFoundation

一般的なデータ型を利用するためのC言語ベースのフレームワーク。これも直接使うのでなくて、さらにObjective-Cのラッパーである、Foundationのクラスを通じて利用することが多い。

Foundation

CoreFoundationの機能の多くのObjective-Cのラッパーを提供。
配列(NSArray),辞書(NSDictionary),URLおよびストリーム処理(NSURL系のクラス)などがある。

ネットワーク通信を行うCF Networkを利用するためにCoreFoundationクラスを利用するためにFoundationクラスを記述するらしい。

CoreOSレイヤ

ハードウェアに近い機能を提供。機能を直接用いることは少ないかもしれないが、他のレイヤのフレームワークから利用されていることが多い。

Accelerate

DSP(Digital Signal Processor 音声信号とか?)や線形代数、信号処理を実行するための機能とインタフェースを含む

CoreBluetooth

アプリケーションからBluetoothの機能を利用するためのフレームワーク

Webアプリケーションとの違い

iOSで開発していく上ではアプリケーションを通しての、あるいは、画面内でのステート管理が大事

バージョン指定やデバイス方向等

開発を始めるときに対象とするOSのVerを指定して、OSのVerを通じて、iPhoneiPadに最適化したアプリケーションを作れる。
iPhoneiPadに対応したアプリはユニバーサルアプリといわれるが現状少ない。
iPhone 6 Plusの登場以降はサイズ差が小さくなってきたので今後増えるかも。
デバイス方向は縦方向と横方向がそれぞれ二種類ずつの計4つ。
すべてサポートするか、一部サポートするかはアプリケーションや画面ごとに選択可能。

Xcode最初のステップ

  • Bundle Identifier

CompanyIdentifier(cf. com.example)とProductName(cf. myApp)をあわせて、
com.example.myApp
という風に作られる。
アプリを一意に識別するための識別子。(火が燃えてるみたい)

Organization Identifier, AppName(デフォルトではProductNameと一緒)の変更は
d.hatena.ne.jp/paraches/20130211

  • Use Core Data

Core Dataとはアプリ内から利用できるSQLiteを利用したデータの永続化機能です。チェックを入れるとひな形も込みで作成。
Androidのとき、アプリの内部でSQLiteなど使って利用できる領域があったけど容量が限られている、みたいな話があった覚えがするけどこちらも何kBくらいとかあるのかな。

  • プロジェクトファイル

ProductNameでXcodeの画面上で表示されている。ファイルシステム上は*.pbxprojのように表示されている。実態はXMLファイル。
プロジェクトに関する設定(プロジェクト名、BundleIdentifierの設定、アプリバージョン、サポートOSなど)が入っている。

  • AppDelegate

システムがアプリを起動し、終了する際の間のライフサイクルで呼ばれるメソッドが定義されたクラス。
エントリポイントとして使用される。

  • ViewController

iOSアプリケーションにおける画面はViewControllerを基本単位としており、簡単に述べると、ViewControllerは画面全体の描画領域と各ViewController間の画面遷移を大きな責務としています。
新しい画面を追加する場合は、このViewControllerの新しいクラスを作ることになる。

Objective-Cについて

pdfが厚かったので、簡単に

iOS SDKで始めるObjective-C入門(7):Objective-Cのクラスやプロパティ、特徴的なメソッドの使い方 (1/3) - @IT

で済ませました。

メソッド

定義

- (戻り値の型)メソッド名 最初の引数 2つ目の引数... 
 {
  // メソッドの中身
 }

2つ目の引数以降にはラベルを書く。ラベルはargInt1やargInt2など2つめ以降の引数の:の前の部分。

- (BOOL)sampleMethod:(NSString *)str argInt1:(NSInteger)arg1 argInt2:(NSInteger)arg2
{
  // メソッドの中身
}

ラベルは、定義したメソッドが呼び出されるとき、その引数が型や何のために使われるのかを分かりやすくする(この例では特に分かりやすくなっていない。おい)。

[obj sampleMethod:@"test" argInt1:number1 argInt2:number2]

呼び出し時

上でも書いたが、

[メソッドを使うインスタンスやクラス クラスやインスタンスのメソッド:引数1 引数2のラベル:引数2 引数3のラベル:引数3]

引数の並びの部分は改行してあってもかまわない。

[メソッドを使うインスタンスやクラス クラスやインスタンスのメソッド:引数1
引数2のラベル:引数2
引数3のラベル:引数3
]

クラスメソッドインスタンスメソッド

-がインスタンスメソッドで+がクラスメソッド

ヘッダファイルとクラスエクステンション

.h拡張子のファイルがヘッダファイル。クラスに宣言するメソッドやプロパティを書く。
このファイルに書いてあるプロパティやメソッドは他のクラスからも参照できる。

参照させたくない場合は、

@interface ClassName ()
  ...
@end

という感じに書く、クラスエクステンションを利用して ... の部分に書いておくと、擬似的なプライベートメソッドになる。
また、メソッド内で自分のインスタンスや変数にアクセスするにはselfを使用する。

ハッシュじゃなくてディクショナリという

いわゆるハッシュにあたるクラスはMSDictionaryという。
あと、あとで値を変更したい配列やDictionaryのインスタンスはMutableがついたクラスを使う。

授業の様子について

  • 講義は0.1 iOSについてと 0.2 Xcode最初のステップについて説明して、1.1 Objective-Cの基礎については説明しながらも、mixi-inc/introduction-for-objective-cをcloneしてきて手を動かしながら自習する感じ。多少慣れている人や予習している人は終わっていたけど、終わっていない人の方が多い。以下のリポジトリのテストを全部グリーンにするのが次回までの宿題。

mixi-inc/introduction-for-objective-c · GitHub

  • ハッシュタグは#mixiiotだったけれど、みんなTwitterじゃなくてgitterで呟いていた感じだった
    • でも、時間がなくて呟くより手を動かすので必死だった印象
  • 手を動かす部分は割と自習になる
    • もともと1時間でこなせる内容では無いし、一回につき4時間程度の復習が前提と事前説明はあり
    • どちらかというと予習してきた方が楽しそう
  • テキストのObjective-C基礎のところ、Objective-Cが想像以上にごつくてびっくりしたのでもう一行分くらい、コメントを添えてほしかった気がする
    • Bootcamp一通りやればある程度慣れてくるのでまじめな人は要らないかもしれない(不真面目)
  • Xcodeのショートカットキーやデバッグ用のボタン等ツールについての説明が未経験者にはありがたかった