第14回iPhone輪講
『私にも見えました』(20歳/学生)
CHAPTER08
Foundationフレームワークの重要なクラス
オブジェクトの変更可能性
一旦生成したインスタンスの属性が,後から変更可能な
(mutable)クラスと,変更不可能な(immutable)
クラスがある
インスタンスを後から変更できる性質の事を
変更可能性(mutability)と呼ぶ事があ...
可変なオブジェクトと
不変なオブジェクト
Foundationフレームワーク内の主な可変,不変な
クラスのペア
種類 不変なクラス 可変なクラス
配列 NSArray NSMutableArray
データ NSData NSMutableDat...
可変なオブジェクトの作成
表のペアは,すべて可変なクラスが不変なクラスの
サブクラスになっている
可変なクラスのインスタンスは,不変なクラスの
インスタンスと同じ動作をする事が出来る
可変なオブジェクトの作成
不変なオブジェクトを可変なオブジェクトとして
扱いたい場合
mutableCopyというメソッドを使って,可変なコピー
を作成する
不変なクラスと可変なクラスがペアで用意
されているクラスであれば利用できる
可変なオブジェクトの生成
不変なクラスのインスタンスに対しmutableCopyを
送る
レシーバと同じ内容の可変なクラスのインスタンス
が生成される
新しく生成されたインスタンスのオーナーは
mutableCopyのセンダ
- (id)mut...
コレクション
コレクションとはデータをまとめて管理する仕組みの事
ObjCのコレクションクラスには
NSArray / NSMutableArray
NSDictionary / NSMutableDictionary
NSSet / NSMu...
NSArray
NSArrayは個々のデータ配列を要素として管理して
まとめる
各要素には0から始まるインデックスがつく
各要素にはそのインデックスを指定して
アクセスする
各要素にはオブジェクトのポインタなら,どの種類の
オブジェクトのポイン...
NSDictionary
NSDictionaryはキー(key)と値(value)をペアとして
管理する
ひとつのペアの事をエントリ(entry)と呼ぶ
エントリのキーには通常は文字列が使われる
エントリは1つのNSDictionaryに複数...
NSDictionary
NSArrayは要素にインデックスを付けて管理していた
NSDictionaryでは各要素に名前をつけて
管理している
NSSet
NSSetはNSArrayやNSDictionaryと同じでオブジェク
トの集合をまとめる
NSArrayなどと違い各要素に順序という概念が無い
インデックスやキーを付けて個々の要素を管理する
ことは出来ない
同じ要素が複数含まれる...
コンビニエンスコンストラクタ
一時的なインスタンスを簡便に生成するメソッドを
ObjCではコンビニエンスコンストラクタと呼ぶ
典型的にはallocとイニシャライザ,autoreleaseを
呼び出してインスタンスを返すようなクラスメソッド
コンビニエンスコンストラクタ
クラスメソッド
fractionWithNumerator:denominator:は,
新たなインスタンスを作成
イニシャライザ
initWithNumerator:denominator:で,
初期化した後,a...
高速列挙
ObjC2.0では配列や集合などのコレクションに格納され
ている要素のオブジェクトを繰り返し順番に取り出す為
の構文が使えるようになった
この機能を高速列挙と呼ぶ
高速列挙
変数groupがコレクションオブジェクトだとすると,
以下の構文でgroupの全要素を順に取り出し表示できる
groupの内容自体に変化は無い
id obj;
for (obj in group) {
printf(“%sn”, [[...
高速列挙
for...inの構文は以下の構造をしている
変数はオブジェクトを格納できる型を持つ必要がある
コレクション式はコレクションオブジェクトを格納し
た変数か,値がコレクションになる式でなければなら
ない
コレクション式はループ実行開始前...
高速列挙
コレクションは不変でも可変でも構わない
可変の場合ループを実行している間に内容を
変更してはいけない
➡変更されると実行が中断される
高速列挙
コレクションが配列の場合
先頭から要素が取り出される
集合の場合
取り出される順序は内部表現に依存する
辞書オブジェクトの場合
取り出されるのはキー
取り出される順序は内部表現に依存する
列挙子NSEnumerator
列挙子とは配列や集合,辞書などのコレクションに
格納されている要素のオブジェクトに順番にアクセス
するための機構
ObjC2.0以降では列挙子を使うよりfor...inの構文の
高速列挙を用いる方が便利
高速列挙の利点
高速列挙を使用する利点はいくつかある
列挙子NSEnumeratorを使うなどの手法より遥かに
効率がいい
構文が簡単
安全である
列挙子には変更防止機能があるので,列挙中に
コレクションを変更しようとすると例外が発生する
高速列挙と列挙子
このfor...inの構文は,コレクションから得た列挙子
を使って,そのコレクションの要素を順番に取り出す
for ( 変数 in 列挙子) { /* 何らかの処理 */}
高速列挙と列挙子
- (NSEnumerator *)reverseObjectEnumerator
要素に逆順にアクセスする為の列挙子を返す
上記のように書けばfor...inの構文を使って
逆順に処理を行うことが出来る
enumerator...
弱い参照を使える
コレクションクラス
ガーベジコレクションを利用する場合,弱い参照で
オブジェクトが格納されているコレクションオブジェクト
を使う事が出来る
要素のオブジェクトを格納するために,強い参照を使って
いるコレクションオブジェクト
➡...
弱い参照を使える
コレクションクラス
次で説明するコレクションクラスはオプションとして
弱い参照を使う事を選択できる
➡ コレクションに格納されていたとしても
不要になったオブジェクトは回収され,
コレクションからも削除される
NSPointerArray
NSPointerArrayはNSArrayに似た配列オブジェクトの
クラス
NSArrayと継承関係はない
可変なコレクション
オブジェクトだけでなく,NULLも含む任意の
データへのポインタを含む事が出来る
NSHashTable
NSHashTableはNSMutableSetに似た可変な
集合オブジェクトのクラス
NSMutableSetと継承関係はない
弱い参照で要素オブジェクトが参照できる点以外は
NSMutableSetと非常によく似ている
NSMapTable
NSMapTableはNSDictionaryに似た可変な
辞書オブジェクトのクラス
NSDictionaryと継承関係はない
キーと値のどちらか,または両方に弱い参照を使える
ガーベジコレクションによってキーと値のどちら...
おわり
Upcoming SlideShare
Loading in...5
×

Objc05

677
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
677
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Objc05

  1. 1. 第14回iPhone輪講 『私にも見えました』(20歳/学生)
  2. 2. CHAPTER08 Foundationフレームワークの重要なクラス
  3. 3. オブジェクトの変更可能性 一旦生成したインスタンスの属性が,後から変更可能な (mutable)クラスと,変更不可能な(immutable) クラスがある インスタンスを後から変更できる性質の事を 変更可能性(mutability)と呼ぶ事がある 例えば文字列では… 不変なインスタンスを作る→NSString 可変なインスタンスを作る→NSMutableString
  4. 4. 可変なオブジェクトと 不変なオブジェクト Foundationフレームワーク内の主な可変,不変な クラスのペア 種類 不変なクラス 可変なクラス 配列 NSArray NSMutableArray データ NSData NSMutableData 辞書 NSDictionary NSMutableDictionary 集合 NSSet NSMutableSet 文字列 NSString NSMutableString 属性付き文字列 NSAttributedString NSMutableAttributedString 文字集合 NSChapterSet NSMutableChapterSet インデックス集合 NSIndexSet NSMutableIndexSet
  5. 5. 可変なオブジェクトの作成 表のペアは,すべて可変なクラスが不変なクラスの サブクラスになっている 可変なクラスのインスタンスは,不変なクラスの インスタンスと同じ動作をする事が出来る
  6. 6. 可変なオブジェクトの作成 不変なオブジェクトを可変なオブジェクトとして 扱いたい場合 mutableCopyというメソッドを使って,可変なコピー を作成する 不変なクラスと可変なクラスがペアで用意 されているクラスであれば利用できる
  7. 7. 可変なオブジェクトの生成 不変なクラスのインスタンスに対しmutableCopyを 送る レシーバと同じ内容の可変なクラスのインスタンス が生成される 新しく生成されたインスタンスのオーナーは mutableCopyのセンダ - (id)mutableCopy
  8. 8. コレクション コレクションとはデータをまとめて管理する仕組みの事 ObjCのコレクションクラスには NSArray / NSMutableArray NSDictionary / NSMutableDictionary NSSet / NSMutableSet などがある
  9. 9. NSArray NSArrayは個々のデータ配列を要素として管理して まとめる 各要素には0から始まるインデックスがつく 各要素にはそのインデックスを指定して アクセスする 各要素にはオブジェクトのポインタなら,どの種類の オブジェクトのポインタでも格納する事が出来る
  10. 10. NSDictionary NSDictionaryはキー(key)と値(value)をペアとして 管理する ひとつのペアの事をエントリ(entry)と呼ぶ エントリのキーには通常は文字列が使われる エントリは1つのNSDictionaryに複数登録できる name lyrics music LIBERTY Salyu Tatsuya Kokufu キー 値 name lyrics music Dialogue ( Salyu , Takeshi Kobayashi ) Takeshi Kobayashi
  11. 11. NSDictionary NSArrayは要素にインデックスを付けて管理していた NSDictionaryでは各要素に名前をつけて 管理している
  12. 12. NSSet NSSetはNSArrayやNSDictionaryと同じでオブジェク トの集合をまとめる NSArrayなどと違い各要素に順序という概念が無い インデックスやキーを付けて個々の要素を管理する ことは出来ない 同じ要素が複数含まれる事は無い
  13. 13. コンビニエンスコンストラクタ 一時的なインスタンスを簡便に生成するメソッドを ObjCではコンビニエンスコンストラクタと呼ぶ 典型的にはallocとイニシャライザ,autoreleaseを 呼び出してインスタンスを返すようなクラスメソッド
  14. 14. コンビニエンスコンストラクタ クラスメソッド fractionWithNumerator:denominator:は, 新たなインスタンスを作成 イニシャライザ initWithNumerator:denominator:で, 初期化した後,autoreleaseを適用して返す + (id)fractionWithNumerator:(int)n denominator:(int)d { id f = [[self alloc] initWithNumerator:n denominator:d]; return [f autorelease]; }
  15. 15. 高速列挙 ObjC2.0では配列や集合などのコレクションに格納され ている要素のオブジェクトを繰り返し順番に取り出す為 の構文が使えるようになった この機能を高速列挙と呼ぶ
  16. 16. 高速列挙 変数groupがコレクションオブジェクトだとすると, 以下の構文でgroupの全要素を順に取り出し表示できる groupの内容自体に変化は無い id obj; for (obj in group) { printf(“%sn”, [[obj description] UTF8String]); }
  17. 17. 高速列挙 for...inの構文は以下の構造をしている 変数はオブジェクトを格納できる型を持つ必要がある コレクション式はコレクションオブジェクトを格納し た変数か,値がコレクションになる式でなければなら ない コレクション式はループ実行開始前に1回だけ 評価される for ( 変数 in コレクション式 ) { /* 何らかの処理 */ }
  18. 18. 高速列挙 コレクションは不変でも可変でも構わない 可変の場合ループを実行している間に内容を 変更してはいけない ➡変更されると実行が中断される
  19. 19. 高速列挙 コレクションが配列の場合 先頭から要素が取り出される 集合の場合 取り出される順序は内部表現に依存する 辞書オブジェクトの場合 取り出されるのはキー 取り出される順序は内部表現に依存する
  20. 20. 列挙子NSEnumerator 列挙子とは配列や集合,辞書などのコレクションに 格納されている要素のオブジェクトに順番にアクセス するための機構 ObjC2.0以降では列挙子を使うよりfor...inの構文の 高速列挙を用いる方が便利
  21. 21. 高速列挙の利点 高速列挙を使用する利点はいくつかある 列挙子NSEnumeratorを使うなどの手法より遥かに 効率がいい 構文が簡単 安全である 列挙子には変更防止機能があるので,列挙中に コレクションを変更しようとすると例外が発生する
  22. 22. 高速列挙と列挙子 このfor...inの構文は,コレクションから得た列挙子 を使って,そのコレクションの要素を順番に取り出す for ( 変数 in 列挙子) { /* 何らかの処理 */}
  23. 23. 高速列挙と列挙子 - (NSEnumerator *)reverseObjectEnumerator 要素に逆順にアクセスする為の列挙子を返す 上記のように書けばfor...inの構文を使って 逆順に処理を行うことが出来る enumerator = [myarray reverseObjectEnumerator]; for (obj in enumerator) { /* 何らかの処理 */ }
  24. 24. 弱い参照を使える コレクションクラス ガーベジコレクションを利用する場合,弱い参照で オブジェクトが格納されているコレクションオブジェクト を使う事が出来る 要素のオブジェクトを格納するために,強い参照を使って いるコレクションオブジェクト ➡ コレクション自体が不要にならない限り, 要素オブジェクトは解放される事は無い
  25. 25. 弱い参照を使える コレクションクラス 次で説明するコレクションクラスはオプションとして 弱い参照を使う事を選択できる ➡ コレクションに格納されていたとしても 不要になったオブジェクトは回収され, コレクションからも削除される
  26. 26. NSPointerArray NSPointerArrayはNSArrayに似た配列オブジェクトの クラス NSArrayと継承関係はない 可変なコレクション オブジェクトだけでなく,NULLも含む任意の データへのポインタを含む事が出来る
  27. 27. NSHashTable NSHashTableはNSMutableSetに似た可変な 集合オブジェクトのクラス NSMutableSetと継承関係はない 弱い参照で要素オブジェクトが参照できる点以外は NSMutableSetと非常によく似ている
  28. 28. NSMapTable NSMapTableはNSDictionaryに似た可変な 辞書オブジェクトのクラス NSDictionaryと継承関係はない キーと値のどちらか,または両方に弱い参照を使える ガーベジコレクションによってキーと値のどちらかが 解放された場合,そのエントリは辞書から削除される
  29. 29. おわり
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×