クラスクラスタってなんぞ?

IOS開発をしている人ならば一度は見た事があるだろう, NSCFNumber というクラス. こいつは何者なんだ...と調べていくうちにクラスクラスタという概念が出てきて整理のためにブログを書く.

Objective-c には抽象クラスがない.

Objective-c には抽象クラスが無い, 正確には抽象クラスという概念は存在するのだが,それをサポートする言語上の仕様は一切無い 例えば, NSObject などは完全に抽象クラスの概念で作られているわけだが, NSObjectのインスタンスを作る事も出来てしまう.

クラスクラスタとは?

Objective-c には抽象クラスは存在しない代わりにクラスクラスタという構造が提供されている 例として、以下のコードを実行してみる.

NSString test

その実行結果は以下のようになる

NSString test result

すべてNSStringクラスのはずなのだが, NSPlaceholderStringやら, __NSCFConstantString などのクラスになっている. これは, Objctive-c がクラスクラスタという構造を持っているからである.

クラスクラスタは,基本となるクラス(パブリッククラス)と特殊な用途のためのサブクラスクラス(コンクリートクラス)から構成される. コンクリートクラスは, プログラマーから隠された存在であり,NSStringクラスのインスタンスを作成すると,自動的に適切なクラスが選択されてそのインスタンスを作る.

つまり

クラスクラスタとは, 基本となるクラスと特殊な要素のために作られたサブクラスの集合体であり

  1. クラスのインスタンスを作成したい

  2. クラスのファクトリメソッドを呼ぶ

  3. クラスが自動的に適切なサブクラスのインスタンスを返す

という流れになっている.

時々目にする, NSCFNumber というクラスは, NSNumberクラスのサブクラス(コンクリートクラス)だった。 多分これであっている気がする。多分...w