web-dev-qa-db-ja.com

Objective-Cで静的メソッドを作成するにはどうすればよいですか?

Javaでは、たとえばUtilityなどのクラスがあり、changeToCapitalLetterと呼ばれる静的メソッドがあるため、次のようなことができます。

Utility.changeToCapitalLetter(myString);

Objective Cで同様のことを行うにはどうすればよいですか?

どうもありがとう

36
Tattat

Objective-Cでは、この「クラスメソッド」を呼び出します。 here を参照してください。

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

+は重要なものです。次のようなメソッドを呼び出します:[MyClass aClassMethod];

102
gammelgul

ウィキペディアから:静的メソッドは、クラスのインスタンスを必要とせず、そのようなデータ(またはthis、self、Meなど)に暗黙的にアクセスすることもできませんインスタンス。

これは、Objective-Cのクラスメソッドではないものを正確に説明しています。

Objective-Cクラスメソッドには、メソッド呼び出しのターゲットであるインスタンスが非常に必要です。つまり、呼び出されるクラスオブジェクトを記述するメタクラスのインスタンスが必要です。

静的メソッドとは異なり、Objective-Cのクラスメソッドは継承できます(前述の自己との組み合わせで、独自のカスタム実装を必要とせずに、多くのクラスがNSObjectで単一のシンプルな+ allocの実装を共有できる理由です)クラスメソッドは、他のメソッド呼び出しサイトとまったく同じobjc_msgSend *ベースのディスパッチメカニズムを通過します。

Objective-Cのクラスメソッドは、クラス階層全体でオーバーライドでき、スウィズルできます。通常、クラスメソッドの代わりに静的メソッドを提供する言語ではサポートされていません。

クラスメソッドと静的メソッドは実際にはほとんどの場合同じですが、違いがあります。静的メソッドでは、クラスは名前空間修飾子として機能します。クラスメソッドを使用すると、クラス自体がオブジェクトであるため、クラスメソッドはクラスオブジェクトに対して、インスタンスメソッドがインスタンスに対してまったく同じことを行います。その結果、次のことができます。

    @interface TestClass : NSObject

    +(void)classOrInstanceMethod;
    -(void)classOrInstanceMethod;

    @end

    @implementation TestClass

    +(void)classOrInstanceMethod{
        NSLog(@"%s", __PRETTY_FUNCTION__); 
    }
    -(void)classOrInstanceMethod{
        NSLog(@"%s", __PRETTY_FUNCTION__); 
    }
    @end

    int main(int argc, const char* argv[])
    {
        @autoreleasepool{
            NSLog(@"Static method in ObjectiveC");
        }

        NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init],
                                            [TestClass class], nil];
        for(id obj in arr)
            [obj classOrInstanceMethod];
    }

呼び出されるclassOrInstanceMethodのバージョンは、objがクラスオブジェクトかインスタンスかによって異なります。ファクトリクラスパターンに精通している場合、このパターンはObjective-C言語の一部です。

一番下の行は、静的メソッドとクラスメソッドが非常に異なることです。その違いは日々のコーディングの目的ではほとんど透明ですが、クラスメソッドがどのように機能するかを知ることで不必要なコード行を大幅に節約できる場合があります。

元のリンク here および here

16
Shekhu