feb19.jp

Nobuhiro Takahashi
Designer / Engineer

NSArray や NSUserDefaults など iOS Foundation Framework のクラスをざっくり解説

NSArray や NSUserDefaults など iOS Foundation Framework のクラスをざっくり解説

なんとなく iOS Cocoa Touch の Foundation フレームワークでよく使う/よく見るクラスをざっくり解説してみます。

Cocoa Touch ってのはこれです。


Foundation Framework

Objective-C でアクセスできます。

Foundation Framework の中では Core Foundation Framework という C でアクセスするフレームワークを呼び出しているそうです。エキスパートObjective-Cプログラミングの本に書いてありました。この本はすごいです。

普通、 iPhone/iPad プログラマは下層の Core Foundation Framework を直接叩くのではなく、この Foundation Framework を叩きます。


今回は以下一覧のクラスをざっくりツイッターの文字数制限以内ぐらいの文字数で一つづつ解説してみます。

というか数年前の自分のメモ書きを掘り起こしてみる作戦です。ちょっと記述として古いとことかもあるかもです。


解説クラス一覧

NSObject
NSNumber
NSNumberFormatter
NSString / NSMutableString
NSArray / NSMutableArray
NSSet / NSMutableSet
NSDictionary / NSMutableDictionary
NSData / NSMutableData
NSDate
NSDateFormatter
NSDateComponents
NSCalendar
NSURL
NSURLConnection
NSURLRequest
NSTimer
NSNotificationCenter
NSNotification
NSUserDefaults
NSBundle
NSValue
NSLog


NSObject

「オブジェクト」。
Objective-C でクラスを作るときはこのクラスを継承する。
必要なメモリを確保したり解放するだとかの基本的なインスタンスの制御機能だけでなく、あるオブジェクト同士が同じものかどうかを比較するだとか、何のクラスのオブジェクトか判定するとか、何秒後にあるメソッドを実行するとか(タイマーの専門家 NSTimer いらず!)、案外便利機能も含まれていたりする。


NSNumber

「数値を格納するオブジェクト」。
int/float などの数値は NSArray や NSDictionary に格納する事ができないので、NSNumber で一度ラップしてから格納してやる。
これ自体は数値ではないので、四則演算はできない。比較も専用のメソッドを使用する。


NSNumberFormatter

「数値に関する便利メソッド群」。
Cocoa Touch には NSNumberFormatter や NSDateFormatter といったように便利メソッド群のクラスがある。(いわゆるアルゴリズム集)
数字の三桁ごとにカンマを入れる処理とか、ロケールごとに通貨表記を変えるとかもこれを使ったりする。
ロジカルシンキングやプログラミングの勉強をするならこれを使わない方が力になる気がしないでもない。


NSString

「文字列を格納するオブジェクト」。
NSNumber 同様、char などは NSArray や NSDictionary に格納できないので、NSString で一度ラップしてやる。
データ系のクラスかとおもいきや、drawForRect などという画面に文字を描画するメソッドもある。
文字を表示するだけなら GUI 系のクラスを使わなくても、これでもいい。


NSMutableString

「編集可能な文字列を格納するオブジェクト」。
Mutable〜 は初期化時以外でも内容を変える事ができる、ということ。
NSString は初期化時以外に変更できないので、後で編集したり、ユーザーの入力情報をサニタイジングする時とかはこっちを使う。
「大は小をかねる」ということで最初から NSMutableString を使っておけばいい気もしないでも無い。


NSArray

「配列を格納するオブジェクト」。
NSNumber や NSString など「プリミティブ系」のオブジェクトだけでなく、NSArray や NSDate まで NS〜が頭につくオブジェクトなら何でも放り込める。
データをたくさん格納しておいて、それらを順番に処理していくに便利。
「リスト表示」とかするときも使う。


NSMutableArray

「編集可能な配列を格納するオブジェクト」。
Mutable〜 は初期化時以外でも内容を変える事ができる、ということ。
NSArray は初期化時以外に変更できないので、後で要素を追加したり、削除したりする時とかはこっちを使う。
「大は小をかねる」ということで最初から NSMutableArray を使っておけばいい気もしないでも無い。


NSSet

「(数学の)集合を表現するオブジェクト」。
ベン図と言われてイメージできる人なら使えるかも。
複数の NSSet があって、どちらの NSSet にも存在する値や、片方にしか存在しない値を抽出するなどの時に便利。
NSSet は「順番のない NSArray」とか「重複を許さない NSArray」だとか比喩されるように NSArray で代用できるのであえて覚える必要はあまりないと思う。
それか、似たメソッドが使えるので逆に NSArray とセットで覚えてもいいかも。


NSMutableSet

「編集可能な(数学の)集合を格納するオブジェクト」。
Mutable〜 は初期化時以外でも内容を変える事ができる、ということ。
NSSet は初期化時以外に変更できないので、後で要素を追加したり、削除したりする時とかはこっちを使う。
「大は小をかねる」ということで最初から NSMutableSet を使っておけばいい気もしないでも無い。
NSSet 系のクラスを使える人はちょっとスタイリッシュな気がする。


NSDictionary

「連想配列のオブジェクト」。
キーから値を呼び出す、辞書みたいなクラス。
objectForKeyで値を取得するとだけ覚えればいい。
大体こっちではなく NSMutableDictionary を使う。


NSMutableDictionary

「編集可能な連想配列のオブジェクト」。
Mutable〜 は初期化時以外でも内容を変える事ができる、ということ。
NSDictionary は初期化時以外に変更できないので、後で要素を追加したり、削除したりする時とかはこっちを使う。
「大は小をかねる」ということで最初から NSMutableDictionary を使っておけばいい気もしないでも無い。
ユーザーのデータや WebAPI のデータを引っ張ってきて、リスト表示したり何かしたりするときは大体これを使う。


NSData

「バイナリデータを格納するオブジェクト」。
データをロードして画像を表示する、音声データをアップロードする、のときは大体 NSData を使う。
ただし NSData を作るときは初期化のときだけで、当たり前だけどインターネットからロードするデータは断片が少しづつ落ちてくるわけなので、NSData じゃなくて NSMutableData を使う。


NSMutableData

「編集可能なバイナリデータを格納するオブジェクト」。
Mutable〜 は初期化時以外でも内容を変える事ができる、ということ。
NSData は初期化時以外に変更できないので、後で要素を追加したり、削除したりする時とかはこっちを使う。
「大は小をかねる」ということで最初から NSMutableData を使っておけばいい気もしないでも無い。
インターネットから徐々に落ちてくるデータを少しづつここに継ぎ足していく。


NSDate

「日付と時間を扱うオブジェクト」。
時計とかカレンダーとか作るなら使う。


NSDateFormatter

「日付に関する便利メソッド群」。
Cocoa Touch には NSNumberFormatter や NSDateFormatter といったように便利メソッド群のクラスがある。(いわゆるアルゴリズム集)
ロジカルシンキングやプログラミングの勉強をするならこれを使わない方が力になる気がしないでもないけど、これを使った方が遥かに便利なので、日付を文字列に変換するときとその逆とかには必ず使う。


NSCalendar

「カレンダーに関するオブジェクト」もとい、「日付に関する便利メソッド群」。
この辺りの API はやけに充実しているが、「その月は何日あるかというチェック」をする場合、NSDate あたりのクラスとこれを組み合わせたりしながら算出する。


NSURL

「URL を格納するオブジェクト」。
文字列じゃなくてわざわざ URL 専用のクラスで用意する必要あるのかと一瞬思うが、生の文字列からポート番号を抽出したり、ドメイン抽出したり、諸々のゾッとするセキュリティ対策とか想像するとあっててよかったって思ったりする。(これ使えばセキュリティは全てカバー、というわけではないのだけど。。)
ちなみに "path" は NSString。各クラスの引数名が path だったら NSURL でなく NSString だと覚えておくと便利。


NSURLConnection

「ネット通信するオブジェクト」。
Web API とかを使って Twitter のデータを引っ張ってきたり、自分たちでつくったサービスに情報を投稿したり、インターネットの画像を読み込んだり、ネット経由でデータをやり取りするときに使う。


NSURLRequest

「通信リクエストの設定を扱うオブジェクト」。
NSURLConnection でどの URL へ、どんな情報を付けて、どうするかというのをこのオブジェクトに定義してあげて、NSURLConnection に渡してあげる。
通信をするときは NSURL、NSURLRequest、NSURLConnection をセットで使う。


NSTimer

「タイマーを管理するオブジェクト」。
3 秒後にどうするとか、定期的に毎分何かするとかを制御できる。
3 秒後関数を実行するレベルだったら、NSObject の関数を使えばできるけども。


NSNotificationCenter

「イベントを通知、あるいは監視するオブジェクト」。
とあるクラスで「タップされた」っていうのを検知したらイベントを発行して通知し、監視している別のクラスが何か動作を始めるといったクラス同士で参照をわざわざ結ばなくても命令の伝達が可能なクラスで、ActionScript でぬくぬくやってきた僕にとって実に素敵なクラス。
ただあんまり速度は速そうな気がしないので、同時にたくさんの通知を走らせることはしないことにしている(僕が)。


NSNotification

「通知の内容を格納するオブジェクト」。
ここでいう通知は NSNotificationCenter で利用される通知のこと。
NSNotificationCenter は通知を伝える管制塔。
そこに送られてまた配信されていく色んな通知が NSNotification。
通知にはもちろんパラメータを渡すことが出来る。


NSUserDefaults

「アプリのセーブデータを扱うオブジェクト」。
設定とか停止した後も保持しておきたいデータはこれで扱う。
新たにファイルを作成してアプリの保存領域に保存させてもいいけどこっちを使う方が一般的。
NSDictionary のようにキーと値を設定して保存する。
呼び出し時は保存のときに設定したキーで取り出せる。
ユーザーデータを扱うので諸々の注意が必要。


NSBundle

「アプリ内ローカルデータを呼び出すときに使うオブジェクト」。
アプリを作るときに色々な画像や音声を含めておいて呼び出すとかの時に使う。
というか大体それぐらい。


NSValue

「大きさや長さや位置、行列などの構造体を扱うオブジェクト」。
CGSize、CGPoint、CGRect または、NSString の文字列処理などで使うような NSRange を扱えるオブジェクト。
これらのデータ型は NSObject を継承していない構造体にすぎないので、NSArray や NSDictionary で扱うことが出来ないため、これを使う。
複数の CGPoint を記憶しておいて、描画時に線で結ぶといったお絵描きアプリを作るときとかに使うかも。


※ちなみにこのように、NS〜と書かれているものはクラスだけではなく、ただのデータ型や関数もある。
int の代わりに使える NSInteger や、値の幅を定義する NSRange 構造体などは値だったり、矩形の領域を定義する CGRect を作るための NSRectMake などは関数だったり。


NSLog

「コンソールへログ出力するためのデバッグ用クラス」。
変数の中身や、ちゃんとここまで実行されたかを確認するために使う。
ログとして吐き出されてしまうので、リリースビルドのときはコメントアウトしておいた方がいいかも。

--------------

表題のイメージ画像は、
ジョン・コンスタブルの「フラットフォードの水門と水車場」の一部です


Tweet Share Bookmark

Navigation

prev: Flash の SWZ ファイルって何ぞや
next: AIR アプリ自動アップデート機能の実装

Recently Entries