「NSArray Class Reference」の編集履歴(バックアップ)一覧はこちら
「NSArray Class Reference」(2010/02/15 (月) 18:46:47) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
//0.下はいじらない
Tags:&tags()
//1.以下に続けてADCでの分類を書き込みリンクする。「NSHogeのクラスリファレンス」、まで書く
&link_toppage(トップ) > [[リファレンス]] > データ管理:データ型とコレクション > NSArrayクラスリファレンス
//2.リファレンス日本語名を見出し1で書く。wiki内のリンクで用いられるタイトルになる。翻訳元にもリンクする。
*NSArray クラスリファレンス [[翻訳元>http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html]]
//3.翻訳元の最終更新日を書く
このページの最終更新:&date()
ADCの最終更新:2009-11-17
//4.以下、用語は頻繁に出てくる単語の翻訳ガイドラインを参照しながら翻訳する。
//5.ある程度書き終わったらタグ(未完または完成、カテゴリ名×3)をつけて下線を引く(広告との境)。これで終了。それではGood Luck!
//本文開始↓
|BGCOLOR(#eef):継承するクラス|BGCOLOR(#eef):[[NSObject>NSObject Class Reference]]|
|TOP:準拠しているプロトコル|[[NSCoding>NSCoding Protocol Reference]]&br()[[NSCopying>NSCopying Protocol Reference]]&br()[[NSMutableCopying>NSMutableCopying Protocol Reference]]&br()[[NSFastEnumeration>NSFastEnumeration Protocol Reference]]&br()[[NSObject (NSObject)>NSObject Protocol Reference]]|
|BGCOLOR(#eef):フレームワーク|BGCOLOR(#eef):/System/Library/Frameworks/[[Foundation.framework>Foundation Framework]]|
|使用可能な環境|Mac OS X v10.0以降|
|TOP:BGCOLOR(#eef):宣言ファイル|BGCOLOR(#eef):NSArray.h&br()NSKeyValueCoding.h&br()NSKeyValueObserving.h&br()NSPathUtilities.h&br()NSPredicate.h&br()NSSortDescriptor.h|
|TOP:コンパニオンガイド|[[Collections Programming Topics for Cocoa]]&br()[[Key-Value Coding Programming Guide]]&br()[[Property List Programming Guide]]&br()[[Predicate Programming Guide]]|
|TOP:BGCOLOR(#eef):サンプルコード|BGCOLOR(#eef):[[CoreRecipes]]&br()[[Quartz Composer WWDC 2005 TextEdit]]&br()[[QuickLookSketch]]&br()[[Sketch+Accessibility]]&br()[[Sketch-112]]|
**概観(Overview)
----
NSArrayとそのサブクラスの[[NSMutableArray]]クラスはオブジェクトの&bold(){配列}と呼ばれるコレクションを管理します。NSArrayクラスは静的配列を、NSMutableArrayクラスは動的配列を生成します。
NSArrayクラスとNSMutableArrayクラスは[[NSCopying>NSCopying Protocol Reference]]プロトコルと[[NSMutableCopying>NSMutableCopying Protocol Reference]]プロトコルに準拠していますが、それは配列を別の型の配列に変換するのを便利にする為です。
NSArrayクラスと[[NSMutableArray]]クラスはクラスクラスタの一部です。したがって、配列は正確にはNSArrayクラスやNSMutableArrayクラスのインスタンスではなく、それらの非公開のサブクラスのインスタンスです。配列のクラスが非公開でも、そのインターフェースは公開されています。なぜなら、それらの抽象スーパークラスであるNSArrayクラスとNSMutableArrayクラスで宣言されているからです。
NSArrayクラスの二つのプリミティブメソッドである&link_anchor(){count}メソッドと&link_anchor(){objectAtIndex:}メソッドはこのクラスのインターフェースの他のメソッドの基盤を提供します。countメソッドは配列の要素数を返し、objectAtIndex:メソッドでは配列の要素にインデックスでアクセスできます。インデックスの値は0から始まります。
&link_anchor(){objectEnumerator}メソッドと&link_anchor(){reverseObjectEnumerator}メソッドは配列の要素に地区時的にアクセスする手段を提供します。二つのメソッド違いは、要素をたどる方向のみです。これらのメソッドがあるおかげで、配列はNSDictionaryのような他のコレクションクラスのオブジェクトで使われる方法とよく似たやり方で走査することができます。objectEnumeratorメソッドの解説のコードの例にこれらのメソッドを使って配列の要素にアクセスする方法を示してありますので、そちらをご覧ください。Mac OS v10.5以降では、高速列挙おプロトコルを使用した方がより効率的です([[NSFastEnumeration]]を参照してください)。
NSArrayクラスは配列の要素に問い合わせるメソッドを提供しています。&link_anchor(){indexOfObject:}メソッドは配列中のその引数と一致するオブジェクトを検索します。検索の結果を決定する為に、配列の各要素には&link_anchor(){isEqual:}メッセージが送られます。これはNSObjectプロトコルで宣言されています。その他、&link_anchor(){indexOfIdenticalTo:}メソッドは配列中に指定したオブジェクトが含まれているかの決定でより特殊なケースを提供します。indexOfIdenticalTo:メソッドは配列中の書く要素のidが引数と一致するかを確認します。
NSArrayクラスの&link_anchor(){filteredArraysUsingPredicate:}メソッドを使えば、プリディケートを使って配列を絞り込み、新たな配列を生成することができます。
NSArrayクラスの&link_anchor(){makeObjectsPerformSelector:}メソッドと&link_anchor(){makeObjectsPerformSelector:withObject:}メソッドは配列中の全てのオブジェクトにメッセージを送信します。配列を完全に動作させる為に、他にも様々なメソッドが定義されています。配列をソートして新しい配列を生成することもできます(&link_anchor(){sortedArrayUdingSelector:}や&link_anchor(){sortedArrayUsingSelector:context}、配列の切り出しには&link_anchor(){subarrayWithRange:})し、NSStringオブジェクトの要素からなる配列を一つの文字列に連結することもできます(&link_anchor(){componentsJoinedByString:})。また、&link_anchor(){isEqualToArray:}メソッドや&link_anchor(){firstObjectCommonWithArray:}メソッドを使って、二つのメソッドを比較することもできます。更に、&link_anchor(){arrayByAddingObject:}メソッドと&link_anchor(){arrayByAddingObjectsFromArray:}メソッドを使えば既存の配列と一つかそれ以上のオブジェクトを新たに含む新しい配列を生成することもできます。
配列はコンテンツへの強うい参照を維持しています。手動メモリ管理環境では各オブジェクトのidが配列に加えられる前にretainメッセージが送られ、配列から子害されるか、配列自体が解放された時にreleaseメッセージが送られます。もしオブジェクトの小勇健の持ち方をかえたいのであれば、代わりに[[CFArray Reference]]、 [[NSPointerArray]]、[[NSHashTable]]を使うことを検討してください。
NSArrayクラスはCore Foundationの対応する[[CFArray Reference]]と「toll-free bridge」です。これはキャストさえ行えば、メソッドや関数中のブリッジされたFoundationオブジェクトとCore Foundation型が交換可能であることを意味しています。したがって、API中のNSArray *パラメータにCFArrayRefを、CFArrayRefパラメータにNSArrayインスタンスを渡すことができます。このことはNSArrayクラスの具体サブクラスにも当てはまります。toll-free bridgeについての詳しい情報は、&italic(){Carbon-Cocoa Integration Guide}を参照してください。
***サブクラス作成時の注意(Subclassing Notes)
NSArrayクラスのサブクラスを作成する理由は通常ほとんどありません。このクラスはオブジェクトの順番を維持したコレクションを保持するように設計され、その通りによく動作します。ですが、カスタムのNSArrayオブジェクトが役に立つ場面もあります。いくつかの可能性としては、
- NSArrayオブジェクトがコレクションに要素をストアする方法を変えたい。おそらくパフォーマンス上の理由や既存のコードとの互換性を挙げる為等が考えられます。
- コレクションに何が起きているのかより詳しい情報を得たい。(例:[statistics gathering])
//統計の集まり…?
****オーバーライドするメソッド(Methods to Override)
NSArrayクラスのサブクラスは全てプリミティブインスタンスメソッドである&link_anchor(){count}メソッドと&link_anchor(){objectAtIndex:}メソッドをオーバーライドしなくてはなりません。これらのメソッドはコレクションの要素を提供するバッキングストアを操作する必要があります。バッキングストアには静的配列や標準のNSArrayクラス、またその他のデータ型やデータ構造を使用できます。一部でも全てでも、実装を変更したいその他のNSArrayクラスのメソッドをオーバーライドすることができます。
サブクラスが管理するバッキングストアに適したイニシャライザを実装したいと思うかもしれません。NSArrayクラスは指定イニシャライザを持っていないので、イニシャライザではスーパークラスの&link_anchor(){init}メソッドを呼ぶだけで構いません。NSArrayクラスはNSCopying、NSMutableCopying、NSCodingプロトコルに準拠しています。もしカスタムサブクラスのインスタンスを複製やコードで生成したいのであれば、これらのプロトコルのメソッドをオーバーライドしてください。
NSArrayクラスはクラスクラスタの公開されたインターフェースであること、それがサブクラスに制限をかけることを忘れないでください。NSArrayクラスのプリミティブメソッドは指定イニシャライザを全く含んでいません。これはつまりサブクラスはストレージを提供し、そのストレージに直接作用するプリミティブメソッドを実装しなければならないということを意味しています。
****特に気をつけること(Special Considerations)
ほとんどの場合は、カスタムのNSArrayクラスはCocoaのオブジェクトの所有権の規則に従うべきです。したがって、コレクションに加えるオブジェクトには&link_anchor(){retain}メッセージを、コレクションから除外するオブジェクトには&link_anchor(){release}メッセージを送る必要があります。もちろん、NSArrayクラスのサブクラスを作る目的が通常と違うオブジェクト保持の動作を実装すること(例えば保持をしない配列)であればこの限りではありません。
****サブクラス作成の代わりに(Alternatives to Subclassing)
NSArrayクラスのサブクラスを作成する前に、[[NSPointerArray]]クラスや、[[NSHashTable]]クラス、対応するCore Foundation型の[[CFArray Reference]]を検討してください。 というのもNSArrayとCFArrayは「toll-free bridged」であり、コード中のNSArrayオブジェクトは(適切なキャストとともに)CFArrayオブジェクトで代用できるからです。二つは対応する型ですが、CFArrayとNSArrayは同一の実装、インターフェースを持っていないので、CFArrayでできることがNSArrayでできないということもあります。例えば、CFArrayはコールバックのセットを提供していて、そのうちのいくつかはカスタムの保持と解放の動作を実装しています。これらのコールバックの実装にNULLを指定すれば、簡単に保持しない配列を生成することができます。
既存のクラスに追加の振る舞いを与えたいのであれば、NSArrayクラスのカテゴリを書くこともできます。ただし、カテゴリは使用中のNSArrayクラスのインスタンス全てに作用し、予想外の結果を生むこともあるということを心に留めておいてください。
**採用しているプロトコル(Adopted Protocols)
----
[[NSCoding>NSCoding Protocol Reference]]
&space(8)&link_anchor(page=NSCoding Protocol Reference,encodeWithCoder:){– encodeWithCoder:}
&space(8)&link_anchor(page=NSCoding Protocol Reference,initWithCoder:){ – initWithCoder:}
[[NSCopying>NSCopying Protocol Reference]]
&space(8)&link_anchor(page=NSCopying Protocol Reference,copyWithZone:){– copyWithZone:}
[[NSMutableCopying>NSMutableCopying Protocol Reference]]
&space(8)&link_anchor(page=NSMutableCopying Protocol Reference,mutableCopyWithZone:){– mutableCopyWithZone:}
**このクラスでできること(Tasks)
----
***配列の生成(Creating an Array)
&space(8)&link_anchor(){+ array}
&space(8)&link_anchor(){+ arrayWithArray:}
&space(8)&link_anchor(){+ arrayWithContentsOfFile:}
&space(8)&link_anchor(){+ arrayWithContentsOfURL:}
&space(8)&link_anchor(){+ arrayWithObject:}
&space(8)&link_anchor(){+ arrayWithObjects:}
&space(8)&link_anchor(){+ arrayWithObjects:count:}
***配列の初期化(Initializing an Array)
&space(8)&link_anchor(){– initWithArray:}
&space(8)&link_anchor(){– initWithArray:copyItems:}
&space(8)&link_anchor(){– initWithContentsOfFile:}
&space(8)&link_anchor(){– initWithContentsOfURL:}
&space(8)&link_anchor(){– initWithObjects:}
&space(8)&link_anchor(){– initWithObjects:count:}
***配列への問い合わせ(Querying an Array)
&space(8)&link_anchor(){– containsObject:}
&space(8)&link_anchor(){– count}
&space(8)&link_anchor(){– getObjects:range:}
&space(8)&link_anchor(){– lastObject}
&space(8)&link_anchor(){– objectAtIndex:}
&space(8)&link_anchor(){– objectsAtIndexes:}
&space(8)&link_anchor(){– objectEnumerator}
&space(8)&link_anchor(){– reverseObjectEnumerator}
&space(8)&link_anchor(){– getObjects:} Deprecated in Mac OS X v10.6
***配列中のオブジェクトの検索(Finding Objects in an Array)
&space(8)&link_anchor(){– indexOfObject:}
&space(8)&link_anchor(){– indexOfObject:inRange:}
&space(8)&link_anchor(){– indexOfObjectIdenticalTo:}
&space(8)&link_anchor(){– indexOfObjectIdenticalTo:inRange:}
&space(8)&link_anchor(){– indexOfObjectPassingTest:}
&space(8)&link_anchor(){– indexOfObjectWithOptions:passingTest:}
&space(8)&link_anchor(){– indexOfObjectAtIndexes:options:passingTest:}
&space(8)&link_anchor(){– indexesOfObjectsPassingTest:}
&space(8)&link_anchor(){– indexesOfObjectsWithOptions:passingTest:}
&space(8)&link_anchor(){– indexesOfObjectsAtIndexes:options:passingTest:}
&space(8)&link_anchor(){– indexOfObject:inSortedRange:options:usingComparator:}
***要素へのメッセージの送信(Sending Messages to Elements)
&space(8)&link_anchor(){– makeObjectsPerformSelector:}
&space(8)&link_anchor(){– makeObjectsPerformSelector:withObject:}
&space(8)&link_anchor(){– enumerateObjectsUsingBlock:}
&space(8)&link_anchor(){– enumerateObjectsWithOptions:usingBlock:}
&space(8)&link_anchor(){– enumerateObjectsAtIndexes:options:usingBlock:}
***配列の比較(Comparing Arrays)
&space(8)&link_anchor(){– firstObjectCommonWithArray:}
&space(8)&link_anchor(){– isEqualToArray:}
***新たな配列の抽出(Deriving New Arrays)
&space(8)&link_anchor(){– arrayByAddingObject:}
&space(8)&link_anchor(){– arrayByAddingObjectsFromArray:}
&space(8)&link_anchor(){– filteredArrayUsingPredicate:}
&space(8)&link_anchor(){– subarrayWithRange:}
***整列(Sorting)
&space(8)&link_anchor(){– sortedArrayHint}
&space(8)&link_anchor(){– sortedArrayUsingFunction:context:}
&space(8)&link_anchor(){– sortedArrayUsingFunction:context:hint:}
&space(8)&link_anchor(){– sortedArrayUsingDescriptors:}
&space(8)&link_anchor(){– sortedArrayUsingSelector:}
&space(8)&link_anchor(){– sortedArrayUsingComparator:}
&space(8)&link_anchor(){– sortedArrayWithOptions:usingComparator:}
***文字列要素の扱い(Working with String Elements)
&space(8)&link_anchor(){– componentsJoinedByString:}
***記述の生成(Creating a Description)
&space(8)&link_anchor(){– description}
&space(8)&link_anchor(){– descriptionWithLocale:}
&space(8)&link_anchor(){– descriptionWithLocale:indent:}
&space(8)&link_anchor(){– writeToFile:atomically:}
&space(8)&link_anchor(){– writeToURL:atomically:}
***パスの収集(Collecting Paths)
&space(8)&link_anchor(){– pathsMatchingExtensions:}
***キー値監視(Key-Value Observing)
&space(8)&link_anchor(){– addObserver:forKeyPath:options:context:}
&space(8)&link_anchor(){– removeObserver:forKeyPath:}
&space(8)&link_anchor(){– addObserver:toObjectsAtIndexes:forKeyPath:options:context:}
&space(8)&link_anchor(){– removeObserver:fromObjectsAtIndexes:forKeyPath:}
***キー値コーディング(Key-Value Coding)
&space(8)&link_anchor(){– setValue:forKey:}
&space(8)&link_anchor(){– valueForKey:}
**クラスメソッド
----
**インスタンスメソッド
----
**定数(Constants)
----
----
//0.下はいじらない
Tags:&tags()
//1.以下に続けてADCでの分類を書き込みリンクする。「NSHogeのクラスリファレンス」、まで書く
&link_toppage(トップ) > [[リファレンス]] > データ管理:データ型とコレクション > NSArrayクラスリファレンス
//2.リファレンス日本語名を見出し1で書く。wiki内のリンクで用いられるタイトルになる。翻訳元にもリンクする。
*NSArray クラスリファレンス [[翻訳元>http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html]]
//3.翻訳元の最終更新日を書く
このページの最終更新:&date()
ADCの最終更新:2009-11-17
//4.以下、用語は頻繁に出てくる単語の翻訳ガイドラインを参照しながら翻訳する。
//5.ある程度書き終わったらタグ(未完または完成、カテゴリ名×3)をつけて下線を引く(広告との境)。これで終了。それではGood Luck!
//本文開始↓
|BGCOLOR(#eef):継承するクラス|BGCOLOR(#eef):[[NSObject>NSObject Class Reference]]|
|TOP:準拠しているプロトコル|[[NSCoding>NSCoding Protocol Reference]]&br()[[NSCopying>NSCopying Protocol Reference]]&br()[[NSMutableCopying>NSMutableCopying Protocol Reference]]&br()[[NSFastEnumeration>NSFastEnumeration Protocol Reference]]&br()[[NSObject (NSObject)>NSObject Protocol Reference]]|
|BGCOLOR(#eef):フレームワーク|BGCOLOR(#eef):/System/Library/Frameworks/[[Foundation.framework>Foundation Framework]]|
|使用可能な環境|Mac OS X v10.0以降|
|TOP:BGCOLOR(#eef):宣言ファイル|BGCOLOR(#eef):NSArray.h&br()NSKeyValueCoding.h&br()NSKeyValueObserving.h&br()NSPathUtilities.h&br()NSPredicate.h&br()NSSortDescriptor.h|
|TOP:コンパニオンガイド|[[Collections Programming Topics for Cocoa]]&br()[[Key-Value Coding Programming Guide]]&br()[[Property List Programming Guide]]&br()[[Predicate Programming Guide]]|
|TOP:BGCOLOR(#eef):サンプルコード|BGCOLOR(#eef):[[CoreRecipes]]&br()[[Quartz Composer WWDC 2005 TextEdit]]&br()[[QuickLookSketch]]&br()[[Sketch+Accessibility]]&br()[[Sketch-112]]|
**概観(Overview)
----
NSArrayとそのサブクラスの[[NSMutableArray]]クラスはオブジェクトの&bold(){配列}と呼ばれるコレクションを管理します。NSArrayクラスは静的配列を、NSMutableArrayクラスは動的配列を生成します。
NSArrayクラスとNSMutableArrayクラスは[[NSCopying>NSCopying Protocol Reference]]プロトコルと[[NSMutableCopying>NSMutableCopying Protocol Reference]]プロトコルに準拠していますが、それは配列を別の型の配列に変換するのを便利にする為です。
NSArrayクラスと[[NSMutableArray]]クラスはクラスクラスタの一部です。したがって、配列は正確にはNSArrayクラスやNSMutableArrayクラスのインスタンスではなく、それらの非公開のサブクラスのインスタンスです。配列のクラスが非公開でも、そのインターフェースは公開されています。なぜなら、それらの抽象スーパークラスであるNSArrayクラスとNSMutableArrayクラスで宣言されているからです。
NSArrayクラスの二つのプリミティブメソッドである&link_anchor(){count}メソッドと&link_anchor(){objectAtIndex:}メソッドはこのクラスのインターフェースの他のメソッドの基盤を提供します。countメソッドは配列の要素数を返し、objectAtIndex:メソッドでは配列の要素にインデックスでアクセスできます。インデックスの値は0から始まります。
&link_anchor(){objectEnumerator}メソッドと&link_anchor(){reverseObjectEnumerator}メソッドは配列の要素に地区時的にアクセスする手段を提供します。二つのメソッド違いは、要素をたどる方向のみです。これらのメソッドがあるおかげで、配列はNSDictionaryのような他のコレクションクラスのオブジェクトで使われる方法とよく似たやり方で走査することができます。objectEnumeratorメソッドの解説のコードの例にこれらのメソッドを使って配列の要素にアクセスする方法を示してありますので、そちらをご覧ください。Mac OS v10.5以降では、高速列挙おプロトコルを使用した方がより効率的です([[NSFastEnumeration]]を参照してください)。
NSArrayクラスは配列の要素に問い合わせるメソッドを提供しています。&link_anchor(){indexOfObject:}メソッドは配列中のその引数と一致するオブジェクトを検索します。検索の結果を決定する為に、配列の各要素には&link_anchor(){isEqual:}メッセージが送られます。これはNSObjectプロトコルで宣言されています。その他、&link_anchor(){indexOfIdenticalTo:}メソッドは配列中に指定したオブジェクトが含まれているかの決定でより特殊なケースを提供します。indexOfIdenticalTo:メソッドは配列中の書く要素のidが引数と一致するかを確認します。
NSArrayクラスの&link_anchor(){filteredArraysUsingPredicate:}メソッドを使えば、プリディケートを使って配列を絞り込み、新たな配列を生成することができます。
NSArrayクラスの&link_anchor(){makeObjectsPerformSelector:}メソッドと&link_anchor(){makeObjectsPerformSelector:withObject:}メソッドは配列中の全てのオブジェクトにメッセージを送信します。配列を完全に動作させる為に、他にも様々なメソッドが定義されています。配列をソートして新しい配列を生成することもできます(&link_anchor(){sortedArrayUdingSelector:}や&link_anchor(){sortedArrayUsingSelector:context}、配列の切り出しには&link_anchor(){subarrayWithRange:})し、NSStringオブジェクトの要素からなる配列を一つの文字列に連結することもできます(&link_anchor(){componentsJoinedByString:})。また、&link_anchor(){isEqualToArray:}メソッドや&link_anchor(){firstObjectCommonWithArray:}メソッドを使って、二つのメソッドを比較することもできます。更に、&link_anchor(){arrayByAddingObject:}メソッドと&link_anchor(){arrayByAddingObjectsFromArray:}メソッドを使えば既存の配列と一つかそれ以上のオブジェクトを新たに含む新しい配列を生成することもできます。
配列はコンテンツへの強うい参照を維持しています。手動メモリ管理環境では各オブジェクトのidが配列に加えられる前にretainメッセージが送られ、配列から子害されるか、配列自体が解放された時にreleaseメッセージが送られます。もしオブジェクトの小勇健の持ち方をかえたいのであれば、代わりに[[CFArray Reference]]、 [[NSPointerArray]]、[[NSHashTable]]を使うことを検討してください。
NSArrayクラスはCore Foundationの対応する[[CFArray Reference]]と「toll-free bridge」です。これはキャストさえ行えば、メソッドや関数中のブリッジされたFoundationオブジェクトとCore Foundation型が交換可能であることを意味しています。したがって、API中のNSArray *パラメータにCFArrayRefを、CFArrayRefパラメータにNSArrayインスタンスを渡すことができます。このことはNSArrayクラスの具体サブクラスにも当てはまります。toll-free bridgeについての詳しい情報は、&italic(){Carbon-Cocoa Integration Guide}を参照してください。
***サブクラス作成時の注意(Subclassing Notes)
NSArrayクラスのサブクラスを作成する理由は通常ほとんどありません。このクラスはオブジェクトの順番を維持したコレクションを保持するように設計され、その通りによく動作します。ですが、カスタムのNSArrayオブジェクトが役に立つ場面もあります。いくつかの可能性としては、
- NSArrayオブジェクトがコレクションに要素をストアする方法を変えたい。おそらくパフォーマンス上の理由や既存のコードとの互換性を挙げる為等が考えられます。
- コレクションに何が起きているのかより詳しい情報を得たい。(例:[statistics gathering])
//統計の集まり…?
****オーバーライドするメソッド(Methods to Override)
NSArrayクラスのサブクラスは全てプリミティブインスタンスメソッドである&link_anchor(){count}メソッドと&link_anchor(){objectAtIndex:}メソッドをオーバーライドしなくてはなりません。これらのメソッドはコレクションの要素を提供するバッキングストアを操作する必要があります。バッキングストアには静的配列や標準のNSArrayクラス、またその他のデータ型やデータ構造を使用できます。一部でも全てでも、実装を変更したいその他のNSArrayクラスのメソッドをオーバーライドすることができます。
サブクラスが管理するバッキングストアに適したイニシャライザを実装したいと思うかもしれません。NSArrayクラスは指定イニシャライザを持っていないので、イニシャライザではスーパークラスの&link_anchor(){init}メソッドを呼ぶだけで構いません。NSArrayクラスはNSCopying、NSMutableCopying、NSCodingプロトコルに準拠しています。もしカスタムサブクラスのインスタンスを複製やコードで生成したいのであれば、これらのプロトコルのメソッドをオーバーライドしてください。
NSArrayクラスはクラスクラスタの公開されたインターフェースであること、それがサブクラスに制限をかけることを忘れないでください。NSArrayクラスのプリミティブメソッドは指定イニシャライザを全く含んでいません。これはつまりサブクラスはストレージを提供し、そのストレージに直接作用するプリミティブメソッドを実装しなければならないということを意味しています。
****特に気をつけること(Special Considerations)
ほとんどの場合は、カスタムのNSArrayクラスはCocoaのオブジェクトの所有権の規則に従うべきです。したがって、コレクションに加えるオブジェクトには&link_anchor(){retain}メッセージを、コレクションから除外するオブジェクトには&link_anchor(){release}メッセージを送る必要があります。もちろん、NSArrayクラスのサブクラスを作る目的が通常と違うオブジェクト保持の動作を実装すること(例えば保持をしない配列)であればこの限りではありません。
****サブクラス作成の代わりに(Alternatives to Subclassing)
NSArrayクラスのサブクラスを作成する前に、[[NSPointerArray]]クラスや、[[NSHashTable]]クラス、対応するCore Foundation型の[[CFArray Reference]]を検討してください。 というのもNSArrayとCFArrayは「toll-free bridged」であり、コード中のNSArrayオブジェクトは(適切なキャストとともに)CFArrayオブジェクトで代用できるからです。二つは対応する型ですが、CFArrayとNSArrayは同一の実装、インターフェースを持っていないので、CFArrayでできることがNSArrayでできないということもあります。例えば、CFArrayはコールバックのセットを提供していて、そのうちのいくつかはカスタムの保持と解放の動作を実装しています。これらのコールバックの実装にNULLを指定すれば、簡単に保持しない配列を生成することができます。
既存のクラスに追加の振る舞いを与えたいのであれば、NSArrayクラスのカテゴリを書くこともできます。ただし、カテゴリは使用中のNSArrayクラスのインスタンス全てに作用し、予想外の結果を生むこともあるということを心に留めておいてください。
**採用しているプロトコル(Adopted Protocols)
----
[[NSCoding>NSCoding Protocol Reference]]
&space(8)&link_anchor(page=NSCoding Protocol Reference,encodeWithCoder:){– encodeWithCoder:}
&space(8)&link_anchor(page=NSCoding Protocol Reference,initWithCoder:){ – initWithCoder:}
[[NSCopying>NSCopying Protocol Reference]]
&space(8)&link_anchor(page=NSCopying Protocol Reference,copyWithZone:){– copyWithZone:}
[[NSMutableCopying>NSMutableCopying Protocol Reference]]
&space(8)&link_anchor(page=NSMutableCopying Protocol Reference,mutableCopyWithZone:){– mutableCopyWithZone:}
**このクラスでできること(Tasks)
----
***配列の生成(Creating an Array)
&space(8)&link_anchor(){+ array}
&space(8)&link_anchor(){+ arrayWithArray:}
&space(8)&link_anchor(){+ arrayWithContentsOfFile:}
&space(8)&link_anchor(){+ arrayWithContentsOfURL:}
&space(8)&link_anchor(){+ arrayWithObject:}
&space(8)&link_anchor(){+ arrayWithObjects:}
&space(8)&link_anchor(){+ arrayWithObjects:count:}
***配列の初期化(Initializing an Array)
&space(8)&link_anchor(){– initWithArray:}
&space(8)&link_anchor(){– initWithArray:copyItems:}
&space(8)&link_anchor(){– initWithContentsOfFile:}
&space(8)&link_anchor(){– initWithContentsOfURL:}
&space(8)&link_anchor(){– initWithObjects:}
&space(8)&link_anchor(){– initWithObjects:count:}
***配列への問い合わせ(Querying an Array)
&space(8)&link_anchor(){– containsObject:}
&space(8)&link_anchor(){– count}
&space(8)&link_anchor(){– getObjects:range:}
&space(8)&link_anchor(){– lastObject}
&space(8)&link_anchor(){– objectAtIndex:}
&space(8)&link_anchor(){– objectsAtIndexes:}
&space(8)&link_anchor(){– objectEnumerator}
&space(8)&link_anchor(){– reverseObjectEnumerator}
&space(8)&link_anchor(){– getObjects:} &color(#dd0000){Deprecated in Mac OS X v10.6}
***配列中のオブジェクトの検索(Finding Objects in an Array)
&space(8)&link_anchor(){– indexOfObject:}
&space(8)&link_anchor(){– indexOfObject:inRange:}
&space(8)&link_anchor(){– indexOfObjectIdenticalTo:}
&space(8)&link_anchor(){– indexOfObjectIdenticalTo:inRange:}
&space(8)&link_anchor(){– indexOfObjectPassingTest:}
&space(8)&link_anchor(){– indexOfObjectWithOptions:passingTest:}
&space(8)&link_anchor(){– indexOfObjectAtIndexes:options:passingTest:}
&space(8)&link_anchor(){– indexesOfObjectsPassingTest:}
&space(8)&link_anchor(){– indexesOfObjectsWithOptions:passingTest:}
&space(8)&link_anchor(){– indexesOfObjectsAtIndexes:options:passingTest:}
&space(8)&link_anchor(){– indexOfObject:inSortedRange:options:usingComparator:}
***要素へのメッセージの送信(Sending Messages to Elements)
&space(8)&link_anchor(){– makeObjectsPerformSelector:}
&space(8)&link_anchor(){– makeObjectsPerformSelector:withObject:}
&space(8)&link_anchor(){– enumerateObjectsUsingBlock:}
&space(8)&link_anchor(){– enumerateObjectsWithOptions:usingBlock:}
&space(8)&link_anchor(){– enumerateObjectsAtIndexes:options:usingBlock:}
***配列の比較(Comparing Arrays)
&space(8)&link_anchor(){– firstObjectCommonWithArray:}
&space(8)&link_anchor(){– isEqualToArray:}
***新たな配列の抽出(Deriving New Arrays)
&space(8)&link_anchor(){– arrayByAddingObject:}
&space(8)&link_anchor(){– arrayByAddingObjectsFromArray:}
&space(8)&link_anchor(){– filteredArrayUsingPredicate:}
&space(8)&link_anchor(){– subarrayWithRange:}
***整列(Sorting)
&space(8)&link_anchor(){– sortedArrayHint}
&space(8)&link_anchor(){– sortedArrayUsingFunction:context:}
&space(8)&link_anchor(){– sortedArrayUsingFunction:context:hint:}
&space(8)&link_anchor(){– sortedArrayUsingDescriptors:}
&space(8)&link_anchor(){– sortedArrayUsingSelector:}
&space(8)&link_anchor(){– sortedArrayUsingComparator:}
&space(8)&link_anchor(){– sortedArrayWithOptions:usingComparator:}
***文字列要素の扱い(Working with String Elements)
&space(8)&link_anchor(){– componentsJoinedByString:}
***記述の生成(Creating a Description)
&space(8)&link_anchor(){– description}
&space(8)&link_anchor(){– descriptionWithLocale:}
&space(8)&link_anchor(){– descriptionWithLocale:indent:}
&space(8)&link_anchor(){– writeToFile:atomically:}
&space(8)&link_anchor(){– writeToURL:atomically:}
***パスの収集(Collecting Paths)
&space(8)&link_anchor(){– pathsMatchingExtensions:}
***キー値監視(Key-Value Observing)
&space(8)&link_anchor(){– addObserver:forKeyPath:options:context:}
&space(8)&link_anchor(){– removeObserver:forKeyPath:}
&space(8)&link_anchor(){– addObserver:toObjectsAtIndexes:forKeyPath:options:context:}
&space(8)&link_anchor(){– removeObserver:fromObjectsAtIndexes:forKeyPath:}
***キー値コーディング(Key-Value Coding)
&space(8)&link_anchor(){– setValue:forKey:}
&space(8)&link_anchor(){– valueForKey:}
**クラスメソッド
----
**インスタンスメソッド
----
**定数(Constants)
----
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: