さて、またもや前回作成した「
MyTestClass」に登場してもらい、引き続きクラスについて考えていくことにしましょう。先に
MyTestClassを利用したとき、このような形でインスタンスを作成したのを思い出してください。
MyTestClass* obj = [[MyTestClass
alloc] init];
まず最初に、
[MyTestClass alloc]を呼び出してインスタンスを作っていました。さあ、ここで質問です。
MyTestClassは、インスタンスですか? もちろん違います。これは
クラスですね。つまりこの
allocは、「
クラスからメソッドを呼び出している」ことになります。
実は、クラスにあるメソッドは、常にインスタンスから呼び出すというわけではないのです。「クラスから直接呼び出せるメソッド」というのも用意することができます。両者を区別するために、クラスから呼び出すものを「
クラスメソッド」、インスタンスから利用するものを「
インスタンスメソッド」と呼んだりします。
両者の違いは、メソッドの定義の一番最初にある記号で区別します。「
-」で始まるものは
インスタンスメソッド、「
+」で始まるものが
クラスメソッド、というわけです。
クラスメソッドは、クラスから直接利用するため、
インスタンスメソッドとはいろいろと性質が違う面があります。なにより重要なのは、「インスタンス変数が使えない」という点でしょう。インスタンス変数は、作成したインスタンスに値を保管するためのものですから、クラスには値を保持できません。したがって、インスタンスに保管されるさまざまな情報にはアクセス出来ません。
また、クラスから直接
インスタンスメソッドを呼び出すこともできません。つまり
クラスメソッドは、
クラスメソッドだけで完結するような形で作成されることになります。そう考えると、用途はだいぶ限定されると言っていいでしょう。
もっとも考えられるのは、保管されるデータなどを必要とせず、渡される引数の値などだけから何かの処理を行わせるようなものです。例えば純粋な計算処理などは、いちいちインスタンスを作ってメソッドを呼び出すより、
クラスメソッドとして実装したほうが便利でしょう。
また、
クラスメソッドとして用意する、非常に重要な機能として忘れてはならないものがあります。それは「
コンビニエンスコンストラクタ」です。