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 附录:有一个 gnu 扩展__builtin_return_address可用于此目的。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 回答