2

[self class] は呼び出されたメソッドのインスタンスの Class を返しますが、メソッドが定義されている Class を取得する方法はありますか? クラス B が A を拡張し、b が B のインスタンスであるとします。b から呼び出された場合でも、B ではなく A を返す A のメソッドが必要です。

編集:

-(void)releaseProperties メソッドを持つ NSObject カテゴリを作成しようとしています。このメソッドは、そのクラスで定義されているすべてのプロパティを取得し、読み取り専用ではないオブジェクト プロパティに対して nil を設定します。

- (void)releaseProperties {
    unsigned int c = 0;
    objc_property_t *properties = class_copyPropertyList([self class], &c);

    for(unsigned int i = 0; i < c; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
        NSString *propertyType = [NSString stringWithUTF8String:property_getAttributes(property)];

        if([propertyType hasPrefix:@"T@"] // is an object
           && [propertyType rangeOfString:@",R,"].location == NSNotFound // not readonly
           ) {
            [self setValue:nil forKey:propertyName];
            NSLog(@"%@.%@ = %@", NSStringFromClass(cls), propertyName, [self valueForKey:propertyName]);
        }
    }
    free(properties);
}

このメソッドを dealloc メソッドで使用したいのですが、class_copyPropertyList([self class], &c) はそのスーパークラスで定義されたプロパティを返さないため、スーパー dealloc チェーンがうまく機能しません。そこで、[self class] を渡す代わりに、特定の dealloc メソッドが呼び出されているクラスを渡したいと思いました。

4

3 に答える 3

2

これを行う直接的な方法はないと思いますがclass_getMethodImplementation_stret、現在のクラスで呼び出して、呼び出されるメソッドの関数ポインターを取得できます。次に、スーパークラスをウォークし、別のものが返されるまで同じ関数を呼び出します。前のスーパークラスは、クラスの実装を提供するものになります。

編集:申し訳ありませんが、質問を読み間違えた可能性があります。そのシグネチャを持つメソッドを定義する階層内の最初のスーパークラスを探している場合は、respondsToSelector:そのうちの 1 つが定義されなくなるまでスーパークラスの呼び出しをたどることができます。上で説明した方法は、定義ではなく、継承された実装を提供するスーパークラスを見つけることです。

たとえば、クラスAが を定義foo:し、クラスB( のサブクラスA) がそれをオーバーライドし、クラスC( のサブクラス) がどこから来たのBかを尋ねることができます。foo:定義を提供するクラスが必要な場合は、A必要であり、ここで説明する 2 番目のアプローチを使用する必要があります。実装を提供するクラスがB必要な場合は、最初に説明した方法を使用する必要があります。

于 2012-05-16T11:29:00.283 に答える
1

私はあなたのために働くかもしれないと感じてい[super class]ます。

また、[super ...B 内で " " (呼び出したいものを空欄に入力) を呼び出すと、A に存在するメソッドを呼び出すことになります。

于 2012-05-16T11:10:05.940 に答える
0

クラス A は、次のようなメソッドを提供できます。

- (Class) classA
{
    return [A class];
}

それは一般化できませんが、あなたの質問は一般化できない答えを主張しています。

欲しいというのはかなり奇妙なことです。これは、設計に問題があることを示唆しています。なぜ欲しいのか聞いてもいいですか?どのような問題を解決しようとしていますか?

于 2012-05-16T12:16:07.093 に答える