如何在使用继承时获取目标C中的调用者类名?

Kri*_*nan 7 inheritance objective-c

我有一个名为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;
Run Code Online (Sandbox Code Playgroud)

可以通过创建子类的实例或在它们的实现中调用configure方法.

我需要知道调用此方法的子类.

这可能吗?

Nik*_*uhe 13

不可以.方法无法知道它们被调用的是哪个其他对象的方法.甚至没有呼叫者身份的概念.可以从C函数调用方法,其中根本没有调用者对象.

我需要知道调用此方法的子类.

话虽这么说,你可能只想知道一个对象是哪个(派生)类:

NSLog(@"My class: %@", NSStringFromClass([self class]));
Run Code Online (Sandbox Code Playgroud)

2014年附录:有一个__builtin_return_address可用于此目的的gnu扩展名.Mike Ash演示了如何使用它来提取呼叫者符号名称(请参阅"呼叫者检查").我仍然认为整个方法有点脆弱,只能用于调试.


del*_*ser 6

接受的答案不正确。

NSArray *stack = [NSThread callStackSymbols];
NSString *methodThatDidLogging = [stack objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)

您可以轻松解析此字符串以获取调用者的类和方法名称。

我在自定义记录器中使用它来打印记录消息的类和方法

干杯

  • 我在回答中没有提到这种方法,因为它对于生产代码来说似乎太脆弱了。它使用“backtrace_symbols” API,该 API 似乎是为了调试和错误处理而设计的。此外,它可能取决于堆栈展开中存在的调试符号。它可能非常慢。 (3认同)