Objective-C のメソッドを大別するとクラスメソッドとインスタンスメソッドの 2 種類あり、その区別は定義するときに、頭に+ が付いていればクラスメソッド、- が付いていればインスタンスメソッドになります。
ところで、通常プログラムを書くときはインスタンスメソッドにすることが多いと思います。クラスメソッドは一体どのような用途に使うのでしょうか、というより、どうやって区別して使い分ければ良いのでしょうか。
今までとても疑問で、本を読んだり、ネットで調べたりしたのですが、今ひとつ、なるほどこうやって使い分けるのか(膝ポン)と納得できていなかったのですが、今日、具体的な事例でクラスメソッドの利用シーンがありました。
例えば、SKSpriteNode のサブクラス (STSpriteNodeSub) を作成し、メソッドを定義することを考えます。頭に SK と付いているのは、SpriteKit 派生のクラスを意味します。SKSpriteNode とは、ゲームの例で言うと、様々なキャラクタなんかを規定するためのクラスです。
今、このサブクラスを使って、丸や四角の形状を持つオブジェクトを生成することにします。
いつものように、
STSpriteNodeSub* hoge = [[STSpriteNodeSub alloc] init];
とインスタンスを生成し、hoge に対してプロパティを与えていく・・・という方法も取れます。インスタンスを生成してから、丸にしたり、四角にしたり順番に操作していく訳です。
この方法ももちろん採れますが・・・明らかにめんどくさいですよね?
例えば、丸であれば、
initWithCircle:(float) radius cener:(CGPoint)centerpoition
のようなメソッドを定義しておける、四角であれば、
nitWithSquare:(float) hsize vertical:(float) vsize position:(CGPoint) centerposition
のようなメソッドを定義できれば、インスタンスを生成する側でコードを減らすことができて便利です。
このように、インスタンスを生成するときに、同じクラスでも様々な種類のインスタンスを生成する必要がある場合は、クラスメソッドとして定義すると随分とやりやすいことが実感できました。