8

BaseClassという基本クラスがあります。BaseClassから派生した多くのクラス、つまりSubClass1、SubClass2、およびSubClass3。

@interface  BaseClass: NSObject{
}
-(void)configure;
@end;

@implementation
-(void)configure{
NSLog(@"This needs to log from which sub class this method was called");
}
@end;

configureメソッドは、サブクラスのインスタンスを作成するか、サブクラスの実装内で呼び出すことができます。

このメソッドがどのサブクラスから呼び出されたかを知る必要があります。

これは可能ですか?

4

4 に答える 4

13

いいえ。メソッドには、他のどのオブジェクトのメソッドから呼び出されているかを知る方法がありません。発信者のアイデンティティの概念すらありません。メソッドは、呼び出し元オブジェクトがまったくないC関数から呼び出すことができます。

このメソッドがどのサブクラスから呼び出されたかを知る必要があります。

そうは言っても、オブジェクトがどの(派生)クラスであるかを知りたいだけかもしれません。

NSLog(@"My class: %@", NSStringFromClass([self class]));

2014補遺:__builtin_return_addressこの目的で使用される可能性のあるgnu拡張機能があります。Mike Ashは、これを使用して発信者のシンボル名を抽出する方法を示しています(「発信者の検査」を参照)。私はまだ全体のアプローチは少し壊れやすいと思います、そしてデバッグのためだけに使われるべきです。

于 2012-08-08T13:10:49.203 に答える
4

受け入れられた答えは正しくありません。

NSArray *stack = [NSThread callStackSymbols];
NSString *methodThatDidLogging = [stack objectAtIndex:1];

この文字列を簡単に解析して、呼び出し元のクラス名とメソッド名を取得できます。

これをカスタムロガーで使用して、メッセージをログに記録しているクラスとメソッドを出力します

乾杯

于 2012-08-08T20:16:27.613 に答える
2

次のものも使用できます。

const char* class_getName(Class cls)

<objc/runtime.h>で定義

于 2013-10-07T02:08:11.957 に答える
1

答えは、クラスとインスタンスのどちらが必要か、そしてそれが関心のあるメッセージの送信者か受信者かによって異なります。

-class method受信者のクラスには、 (で宣言されているNSObject)を使用できます。

-(void)configure
{
    NSLog(@"This logs from which sub class this method was called");
    NSLog(@"Class of this object is %@", [self class]);
}

レシーバーインスタンスはselfもちろんです。が関心のある送信者である場合、これを自動的に取得することはできませんが、引数として渡すことはできます。だからあなたは次のようなものを持っているでしょう

-(void)configure:(id)sender
{
    NSLog(@"This logs from which sub class this method was called");
    NSLog(@"Class of object that called this method is %@", [sender class]);
}
于 2012-08-08T13:07:54.760 に答える