NSArrayクラス
解説
「配列」と呼ばれるコレクションクラスの一つです。
NSArrayは変更しない配列クラスで、NSMutableArrayが変更可能な配列クラスです。
NSSetとの違いは、NSArrayは順序が付いていること、重複が許されるということです。
NSArrayとNSMutableArrayはNSCopyingとNSMutableCopyingプロトコルに準拠します。
NSArrayとNSMutableArrayはクラスクラスタの一部です。
インスタンスはNSArrayやNSMutableArrayであるとは限りません。
しかしNSArrayやNSMutableArrayのプライベートなサブクラスではあります。
CFArrayとToll-free-bridgedです。
配列オブジェクトは破棄される時にreleaseメッセージを送信します。
配列に入れる際にautoreleaseしておきます。
継承 | NSObject |
準拠 | NSCoding |
NSCopying | |
NSMutableCopying | |
NSFastEnumeration | |
NSSecureCoding | |
NSObject (NSObject) | |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0 以降 |
iOS 2.0 以降 | |
定義 | NSArray.h |
NSKeyValueCoding.h | |
NSKeyValueObserving.h | |
NSPathUtilities.h | |
NSPredicate.h | |
NSSortDescriptor.h |
概要
本クラスについて
配列と呼ばれる順序付きのコレクションクラスです。一旦作成した後、変更することはできません。変更可能な配列はNSMutableArrayを使います。
配列に含まれる各要素は、配列に含まれる際にコピーされません。(一部を除く、下記参照)NSArray自体は変更不可ですが、含まれる各要素が例えばNSMutableStringなど変更可能なオブジェクトである場合、その要素の内容は変更することができます。
なお、配列に各要素をコピーして含ませるメソッド(– initWithArray:copyItemsでcopyItemsにYESを与えた場合)もあります。
各要素は配列に含まれる際にretainメッセージが送信されます。取り除かれる際にはreleaseメッセージが送信されます。
C言語のフレームワークである、Core FoundationのCFArrayRefとトールフリーブリッジです。ARC環境以外ではそのまま使用できます。
どちらかのフレームワークにしかないメソッド・関数を使いたい場合、キャストして使うことが出来ます。
ARC環境では、管理対象のオブジェクトキャストに__bridge、__bridge_retained、__bridge_transferが必要になります。
*
作成
複数のオブジェクトから配列を作成するメソッド(+ arrayWithObjects: )、ファイルの内容から作成するメソッド(+ arrayWithContentsOfFile: )、配列から配列を作成するメソッド(+ arrayWithArray: )などがあります。
NSMutableArrayのために空の配列を作るメソッド(+ array)もあります。
初期化
複数のオブジェクトから配列を初期化するメソッド(– initWithObjects)、ファイルの内容から初期化するメソッド(– initWithContentsOfURL)、配列から配列を初期化するメソッド( – initWithArray)などがあります。
配列に要素を入れる場合には、通常要素のコピーは行いませんが、(– initWithArray:copyItems)メソッドのcopyItemsにYESを渡すと、各要素がコピーされ、その参照が配列に含まれます。
クエリ
配列に要素がいくつあるかを調べるメソッド(– count)、指定したインデックスの要素を取り出すメソッド(– objectAtIndex)指定したインデックスセットの要素を配列で取り出すメソッド(– objectsAtIndexes:)、最後の要素を取り出すメソッド( – lastObject)などがあります。
配列の要素に指定のオブジェクトが含まれているかを調べるメソッド(– containsObject)があり、各要素に対してisEqual:メッセージを送信して同じかどうかを判断します。
各要素を順番に調べるためにNSEnumeratorオブジェクトを返すメソッド(– objectEnumerator)、逆順のNSEnumeratorオブジェクトを返すメソッド(– reverseObjectEnumerator)がありますが、NSFastEnumeratorプロトコルやNSArrayの(- enumerateObjectsUsingBlock)メソッドを使って処理できるため、NSEnumeratorを使う機会は減っています。
配列でオブジェクトを見つける
指定したオブジェクト(– indexOfObject)・範囲(– indexOfObject:inRange)・条件(– indexOfObjectPassingTest)などに合うインデックスを返すメソッドがあります。
先頭がindexOf…となっているメソッドは最初に見つけた要素のインデックス一つを返しますが、先頭がindexesOf…となっているメソッドはNSIndexSetで複数のインデックスを返すことができます。
要素にメッセージを送信
各要素すべてにメッセージを送信することができます。セレクタを使う方法(– makeObjectsPerformSelector)や、ブロックオブジェクトを使って(– enumerateObjectsUsingBlock:)送信することができます。ブロックオブジェクトを使う方法(– enumerateObjectsWithOptions:usingBlock)でオプション(NSEnumerationConcurrent)を指定すると並列処理を行うことができます。
ブロックオブジェクトを使って各要素を調べる方法
NSArray *anArray = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",nil]; NSString *itemToFind = @"ccc"; __block BOOL foundIt = NO;//ブロック内で変更できるように__blockを付ける //配列anArrayにcccが含まれるかどうかを探す。 [anArray enumerateObjectsWithOptions:NSEnumerationConcurrent //並列 //NSEnumerationReverse //逆向き usingBlock:^(id s,NSUInteger idx,BOOL *stop){ if ([(NSString*)s isEqual:itemToFind]) { foundIt=YES; //見つけたらfoundItをYESに *stop=YES; //見つけたら検索をストップ } return; }]; NSLog(@"%s : %@", __FUNCTION__,foundIt?@"YES":@"NO"); //=>[OOOAppDelegate method024] : YES
配列の比較
配列が別の配列と同じかどうかを比較するメソッド(– isEqualToArray)があります。
新しい配列の作成
指定した範囲の要素を別の配列にして返すメソッド(– subarrayWithRange)やNSPredicateクラスを使って条件に合う要素のみを別の配列にするメソッド(– filteredArrayUsingPredicate: )があります。
ソート
配列の要素を並べ替える方法は大きく分けて4つあり、比較関数を使うメソッド(– sortedArrayUsingFunction:context)、デスクリプタを使うメソッド(– sortedArrayUsingDescriptors)、セレクタを使うメソッド(– sortedArrayUsingSelector)、コンペレータを使うメソッド(– sortedArrayUsingComparator: )となっています。
コンペレータを使い、オプションを指定(NSSortConcurrent)することで並列処理ができるメソッド( – sortedArrayWithOptions:usingComparator: )もあります。
保存
配列を保存するにはファイルパスで指定するメソッド(– writeToFile:atomically)、URLで指定するメソッド(– writeToURL:atomically:)があります。URL形式を使う事が推奨されていますのでURLで指定するほうがいいでしょう。atomically:でYESを指定すると一旦別のファイルに書きだした後、元のファイルを移動して、新しく作ったファイルを移動してリネームします。
このメソッドを使うことで、plist形式のファイルで保存されます。
キーバリュー監視
配列に含まれる辞書や、配列に含まれる要素のプロパティがキーで特定できる場合、監視対象として登録(– addObserver:toObjectsAtIndexes:forKeyPath:options:context: )することができます。登録したキーやプロパティの値が変更された場合には通知されます。
キーバリューコーディング
配列に含まれる辞書や、配列に含まれる要素のプロパティがキーで特定できる場合、キーで指定した値の取得(– valueForKey)、変更(– setValue:forKey)ができます。
適合するプロトコル
NSCoding
encodeWithCoder:
initWithCoder:
NSCopying
copyWithZone:
NSMutableCopying
mutableCopyWithZone:
NSFastEnumeration
countByEnumeratingWithState:objects:count:
メソッド
– getObjects OS X 10.6,iOS4.0で使用中止
定数
NSBinarySearchingOptions
iOS7.0で追加
-[NSArray firstObject]
-[NSArray init]
-[NSMutableArray init]