macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSArrayクラス

変更しない配列クラス

INDEX>Foundation>NSArray

apple(mac)

apple(iOS)

更新時OS Ver.:OS X 10.8,iOS 7.0

解説

「配列」と呼ばれるコレクションクラスの一つです。
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:

メソッド

配列の作成
メソッド OS X iOS 説明
+ array 10.0 2.0 配列を作成します。NSMutableArrayで使用します。
+ arrayWithArray: 10.0 2.0 別の配列で配列を作って返します。
+ arrayWithContentsOfFile: 10.0 2.0 指定したパスのファイルの中身からNSArrayを作って返します。
+ arrayWithContentsOfURL: 10.0 2.0 指定したURLの中身からNSArrayを作って返します。
+ arrayWithObject: 10.0 2.0 指定したオブジェクトからNSArrayを作って返します。
+ arrayWithObjects: 10.0 2.0 複数のオブジェクトからNSArrayを作って返します。
+ arrayWithObjects:count: 10.0 2.0 複数のオブジェクトから指定した分だけを含むNSArrayを返します。
配列の初期化
メソッド OS X iOS 説明
– initWithArray 10.0 2.0 他の配列で初期化して返します。
– initWithArray:copyItems 10.0 2.0 他の配列で初期化して返します。要素をコピーして初期化するかを指定できます。
– initWithContentsOfFile 10.0 2.0 ファイルの内容からNSArrayを初期化して返します。
– initWithContentsOfURL 10.0 2.0 ファイルの内容からNSArrayを初期化して返します。
– initWithObjects 10.0 2.0 与えたオブジェクトで配列を作って返します。
– initWithObjects:count 2.0〜
配列でのクエリ
– containsObject 2.0 配列の要素に指定のオブジェクトが含まれているかを返します。
– count 2.0 配列の要素数を返します。
– getObjects:range
– lastObject 2.0〜
– objectAtIndex 2.0〜
– objectAtIndexedSubscript:
– objectsAtIndexes 2.0〜
– objectEnumerator 2.0〜
– reverseObjectEnumerator 2.0〜
配列でオブジェクトを検索
– indexOfObject 2.0〜
– indexOfObject:inRange 2.0〜
– indexOfObjectIdenticalTo 2.0〜
– indexOfObjectIdenticalTo:inRange 2.0〜
– indexOfObjectPassingTest 4.0〜
– indexOfObjectWithOptions:passingTest 4.0〜
– indexOfObjectAtIndexes:options:passingTest 4.0〜
– indexesOfObjectsPassingTest 4.0〜
– indexesOfObjectsWithOptions:passingTest 4.0〜
– indexesOfObjectsAtIndexes:options: passingTest 4.0〜
– indexOfObject:inSortedRange: options:usingComparator 10.6 4.0〜 指定の範囲、オプションでNSComparatorブロックを使って、 探したい要素の番号を返します。
要素にメッセージを送信
– makeObjectsPerformSelector 2.0〜
– makeObjectsPerformSelector:withObject 2.0〜
– enumerateObjectsUsingBlock 10.6 iOS4.0 配列のそれぞれのオブジェクトにブロックを実行します。
– enumerateObjectsWithOptions:usingBlock 10.6 iOS4.0 配列のそれぞれのオブジェクトにブロックを実行します。
– enumerateObjectsAtIndexes: options: usingBlock 4.0〜
配列の比較
– firstObjectCommonWithArray
– isEqualToArray 2.0〜
新しい配列の配送
– arrayByAddingObject iOS2.0 レシーバにオブジェクトを追加した新しい配列を返します。
– arrayByAddingObjectsFromArray iOS2.0
– filteredArrayUsingPredicate 10.4 iOS3.0 predicateをレシーバーの内容に対して評価し、一致するオブジェクトを含む新しい配列を返します
– subarrayWithRange 2.0〜
ソート
– sortedArrayHint 2.0〜
– sortedArrayUsingFunction:context 2.0〜 関数で比較して並び替えた配列を返します。
– sortedArrayUsingFunction:context:hint 2.0〜
– sortedArrayUsingDescriptors 10.3 2.0〜
– sortedArrayUsingSelector 2.0〜 配列内の要素を比較して、昇順にソートされた配列を返します。
– sortedArrayUsingComparator 10.6 4.0 NSComparatorブロックでソートした配列を返します。 
– sortedArrayWithOptions:usingComparator 10.6 4.0 NSComparatorブロックでソートした配列を返します。 
文字列エレメントと動作する
メソッド OS X iOS 説明
– componentsJoinedByString iOS2.0 配列の要素が全て文字列の場合、配列の全ての要素をセパレータをいれてつなげます
詳細の作成
メソッド OS X iOS 説明
– description 10.0 iOS2.0 配列を文字列で返します。
– descriptionWithLocale 2.0〜
– descriptionWithLocale:indent 2.0〜
– writeToFile:atomically 10.0 2.0 指定したパスのファイルに書き込みます。
– writeToURL:atomically 10.0 2.0 指定したURLに書き込みます。
パスの適正化
– pathsMatchingExtensions 2.0〜
キーバリューオブザービングビング
– addObserver:forKeyPath:options:context 10.4 2.0
– removeObserver:forKeyPath 10.4 2.0〜
– addObserver:toObjectsAtIndexes: forKeyPath:options:context 10.4 2.0
– removeObserver:fromObjectsAtIndexes: forKeyPath 2.0〜
– removeObserver:forKeyPath:context 5.0〜
– removeObserver:fromObjectsAtIndexes:forKeyPath:context 5.0〜
キーバリューコーディング
– setValue:forKey 2.0〜
– valueForKey 2.0〜
廃止されたメソッド 2.0〜4.0

– getObjects OS X 10.6,iOS4.0で使用中止

定数

NSBinarySearchingOptions

iOS7.0で追加

-[NSArray firstObject]
-[NSArray init]
-[NSMutableArray init]