クラスメソッドとオブジェクトメソッドの違いは知っていますが、iOSでクラスメソッドを使用する理由がわかりません。誰かが私に例を教えてくれるので、私はそれを理解することができます.. ??
5 に答える
クラスメソッドはクラスが処理するメソッドであり、インスタンスメソッドは個々のインスタンスのメソッドです。
NSString
クラスメソッドの一般的なユースケースは、 'sのような便利なアロケータ+stringWithFormat:
です。使用するのと同じですが(ARCを使用していない場合は自動リリースが追加されます)[[NSString alloc] initWithFormat:]
、時間を大幅に節約できます。
別の例はMFMailComposeViewController
の+canSendMail
メソッドです。メールの送信がサポートされているかどうかを確認するためだけに、最初にインスタンスを作成する必要はありません。クラスはこれをよく知っているため、このメソッドはインスタンスメソッドではなくクラスメソッドです。
Stackoverflowはあなたの友達です。
クラスメソッドは通常、NSStringの+ stringWithFormatなどの便利なメソッドです。つまり、クラスを使用するためにクラスをインスタンス化する必要はありません。
クラスメソッドとオブジェクトメソッド。
@interface TheClassA : NSObject
+ (TypeA)classMethod;
- (TypeB)objectMethod;
@end
@implementation TheClassA
+ (TypeA)classMethod
{
}
- (TypeB)objectMethod
{
}
@end
main()
{
[TheClassA classMethod]; // Correct!!!
[TheClassA objectMethod]; // Wrong!!!
TheClassA *obj = [[TheClassA alloc] init];
[obj classMethod]; // Wrong;
[obj objectMethod]; // Correct;
[obj.class classMethod]; // Correct
[obj.class objectMethod]; // Wrong
}
クラスメソッドには、一般的なC言語関数のようなスコープがあります。グローバル方式です。しかし...オブジェクトメソッドはオブジェクトのみを有効にします...クラスメソッドはそのクラスプロパティを変更できず、オブジェクトにメッセージを送信できません。ただし、オブジェクトメソッドはオブジェクトにメッセージを送信したり、プロパティを変更したりできます。
幸運を。
私はよくクラスメソッドを使用して、「シングルトン」と呼ばれるデザインパターンを使用するプログラムを作成します。たとえば、他のクラスからのリクエストを処理するクラスがある場合、リクエスト処理クラスのインスタンス化は1回だけで済み、プログラム全体で同じものを使用する必要があります。リクエスト処理クラスに、インスタンス化を保持する静的変数を配置します。
static MyRequestHandler *requestHandler;
そして、クラスメソッドを使用して取得します。まだ存在していない場合は、最初に作成してから保存します。
+ (MyRequestHandler *) getRequestHandler {
if (requestHandler == nil) {
requestHandler = [[MyRequestHandler alloc]init];
}
return requestHandler;
}
他のクラスは、このようなコードでこのインスタンス化に到達できます
MyRequestHandler *requestHandler = [MyRequestHandler getRequestHandler];
クラスメソッドは、ライブラリルーチンに使用されます。これらのメソッドにアクセスするために、オブジェクトを作成する必要はありません。
たとえば、オブジェクトを簡単に初期化できる場合があります。
NSArray *arr = [NSArray array];