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

时间:2012-08-08 13:03:50

标签: objective-c inheritance

我有一个名为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 个答案:

答案 0 :(得分:13)

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

  

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

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

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

2014年补遗:有一个可用于此目的的gnu扩展名__builtin_return_addressMike Ash shows如何使用它来提取呼叫者符号名称(请参阅“呼叫者检查”)。我仍然认为整个方法有点脆弱,只能用于调试。

答案 1 :(得分:2)

接受的答案不正确。

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

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

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

干杯

答案 2 :(得分: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]);
}

答案 3 :(得分:1)

您也可以使用:

const char* class_getName(Class cls)

在< objc / runtime.h>

中定义