概要
NSArrayと、そのサブクラスNSMutableArrayは、配列(arrays)と呼ばれる順序つきのコレクションを取り扱うクラスです。NSArrayは静的な配列を、NSMutableArrayは動的な配列を生成します。オブジェクトが入った順序つきのコレクションを必要としたら、この配列が使えます。
NSArrayは、これの Core Foundationでのカウンターパート、CFArrayRef、と“toll-free bridge”になっています。toll-free bridgingについて、より詳細は“Toll-Free Bridging”を参照してください。
サブクラス化する際の注意
NSArrayをサブクラス化する理由は、一般的にまったくありません。このクラスに求められている機能、オブジェクトを内包する順序つきのコレクションを取り扱う、は十分に果たします。しかし、便利な機能を持ったNSArrayのカスタムサブクラスを利用したい場面はあります。いくつかの事例を挙げます:
- 要素のコレクションをNSArrayがどのように保持しているかを変える。パフォーマンス的な理由であったり、後方のコードと互換性を保つ理由があるでしょう。
- コレクションに起こっている情報を、より詳細に集める(たとえば、統計値の収集)。
オーバーライドすべきメソッド
NSArrayのサブクラスはすべて、プリミティブメソッドのcountとobjectAtIndex:インスタンスメソッドをオーバーライドしなくてはなりません。それらメソッドは、コレクションの要素へ提供するバッキングストアを操作しなくてはなりません。このバッキングストアのためには静的な配列、つまり普通のNSArrayオブジェクトか、他のタイプか、あるいは何らかの機構が使えます。そのほかのNSArrayが備えるメソッドを代替的な実装で提供したいなら、部分的でも全体的にでもオーバーライドすることができます。
サブクラスが管理するバッキングストアに適したイニシャライザを実装したいこともあるでしょう。そうするなら、そのイニシャライザはNSArrayの指定イニシャライザ、initもしくはinitWithObjects:count:のどちらか一方を呼び出さなければなりません。NSArrayクラスは、NSCopying, NSMutableCopying, and NSCodingプロトコルに準拠しています。copyingかcodingから生成したカスタムサブクラスのインスタンスが必要なら、それらプロトコルに適合するようメソッドをオーバライドします。
NSArrayはクラスクラスタへの公開インターフェイスであり、このことがサブクラスへ影響を与えているのを覚えておいてください。サブクラスへバッキングストアを用意するのと、そのストアへ直接に働きかけるプリミティブメソッドを実装しなくてはなりません。
サブクラス化とは別の方法
NSArrayのカスタムクラスを作る前に、NSPointerArrayとそれに対応するCore Foundation type, CFArray Referenceを検討して下さい。NSArrayとCFArrayは“toll-free bridged”なので、コードにあるNSArrayオブジェクトの代わりとりてCFArrayオブジェクトで置き換えられます(適切なキャスティングを用いて)。CFArrayとNSArrayはお互いに対応するものですが、これらのインターフェイスも実装も全く同じではなく、CFArrayで行えることがNSArrayではまったく簡単にはできないことが時にはあります。たとえば、CFArrayは一連のコールバック関数を提供しており、それらのいくつかは特有なretain-release振る舞いを実行します。
それらのコールバックへNULL実行を指示すると、簡単にretainを行わない配列が得られます。
補足的なものを既に存在しているクラスの振る舞いへ加えるなら、NSArrayのカテゴリを書くべきでしょう。しかしながらカテゴリは、NSArrayのすべてのインスタンスへ影響を与えるので、意図しない結果が得られるかもしれないのを覚えておいてください。その他としては、望んでいる振る舞いを得るのに合成を使うこともできます。
Copyright © 2013 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2013-10-22
- This document is referred from the original, NSArray Class Reference, Mac Developer LibraryDeveloperSearch, updated in 2013-10-22.