4

同じオブジェクトの静的メソッドから非静的メソッドを呼び出すにはどうすればよいですか?

静的メソッドの内部:使用する[ClassName nonStaticMethod] 場合または使用する場合[self nonStaticMethod] 警告が表示されます:クラスメソッド'+ isTrancparentImageWithUrl:'が見つかりません(戻り型のデフォルトは' id')

4

5 に答える 5

7

1つの解決策(そして非常に物議を醸す)解決策は、クラスをシングルトン実装に変換してから、すべての静的メソッドを通常のメソッドに変換することです。

たとえば、FileManagerというクラスがあり、そこに次のようなメソッドがある場合

+ (NSString *) getDocumentsDirectory

何らかの理由で、そこから非静的メソッドを呼び出したい場合は、実装を次のように変更する必要があります。

+ (FileManager *)sharedInstance {
    // Singleton implementation
    static FileManager* instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[FileManager alloc] init];
    });
    return instance;
}

- (NSString *) getDocumentsDirectory

そして呼び出す代わりに

[FileManager getDocumentsDirectory]; 

あなたは電話します

[[FileManager sharedInstance] getDocumentsDirectory];

シングルトンを作成したくない理由はいくつかありますが、それは私の回答の範囲を超えています:)。

于 2012-05-15T14:21:15.393 に答える
3

クラス以外のメソッドを呼び出すには、クラスのオブジェクトを作成する必要があります。そのようなメソッドを呼び出すにはインスタンスが必要です。そのため、これらのメソッドはインスタンスメソッドと呼ばれます。

クラスメソッドは任意のインスタンスではなくクラスを指している[self instanceMethod]ため、クラスメソッドからの呼び出しは機能しません。ここでは、クラスメソッドでの使用に関する情報を見つけることができます。selfself

于 2012-05-15T14:22:36.910 に答える
1

できません

インスタンスメソッドで静的メソッド/変数を呼び出すことはできますが、その逆はできません。

理由は単純です。静的メソッドは、クラスのインスタンス(オブジェクト)ではなく、クラスにバインドされます。

于 2012-05-15T14:13:21.867 に答える
0

現在のクラスのインスタンスを作成し、それを呼び出すことができますが、そうすることはお勧めしません。静的メソッドは非静的メソッドを呼び出すことはできません-静的コンテキストには「this」はありません。

于 2012-05-15T14:13:45.177 に答える
0

staticObjective-Cには方法はありません。呼び出したい場合[Class method]は、クラスメソッドと呼ばれます(ANSI Cに関しては静的ではありません)

ただし、Singletonパターンが役立つ場合があります:http: //cocoadev.com/wiki/SingletonDesignPattern

(基本的に、オブジェクトの静的共有インスタンスを保持します)

編集: [ClassName instanceMethod]-nonStaticMethodは定義されていませんClassName。オブジェクト(インスタンス)用に定義されているためClassName、使用できません(存在しません)。アプリがクラッシュする可能性があります。

[self instanceMethod]self-クラスメソッドを呼び出すときは、オブジェクト(インスタンス)がないため、これも使用できません。上記で投稿したシングルトンパターンを使用して、回避策を講じることができます。

于 2012-05-15T14:15:40.320 に答える