我有一个名为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方法。
我需要知道调用此方法的子类。
这可能吗?
答案 0 :(得分:13)
没有。方法无法知道调用哪个其他对象的方法。甚至没有呼叫者身份的概念。可以从C函数调用方法,其中根本没有调用者对象。
我需要知道调用此方法的子类。
话虽这么说,你可能只想知道一个对象是哪个(派生)类:
NSLog(@"My class: %@", NSStringFromClass([self class]));
2014年补遗:有一个可用于此目的的gnu扩展名__builtin_return_address
。 Mike 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>
中定义