Objective-C类@implementation块 - 如何在里面引用名称/类

时间:2014-11-25 17:21:54

标签: objective-c

我想知道实现块的名称。编译器提供

__FILE__

为了给你编译时文件名,我一直无法找到任何获取当前实现块名的方法。像这样的东西会起作用:

@implementation MyClass {
    +(NSString*)implementationBlockName {
        return __IMPL_BLOCK_NAME__;
    }
}

但我正在寻找任何获取此信息的方法。注意:我不是在寻找一个对象的运行时类型或者在调用它们时恰好是“self”的类的类型。

作为一个附加示例,这个非常有用的地方是+(void)initialize方法。每个子类将调用其链中的所有+(void)初始化方法。通常,您希望初始化只运行一次,因此代码如下所示:

+(void)initialize {
    if(self == [MyImplementationBlockClass class]) {
        // Do implementation
    }
}

这显然容易出错,您可以轻松地在其中输入错误的类名,没有任何内容可以警告您。如果有一种方法可以引用@implementation类型,它将保存错误:

if(self == __MAGIC_IMPL_CLASS__) {...}

2 个答案:

答案 0 :(得分:1)

你所说的"显然容易出错"是永远不会出错的事情。如果OOP编程范例得到尊重,那么很难找到问题的用例。但是:

如果方法没有在子类中重写 - 这是一个更容易出错的假设 - 你可以检查从[self class]开始向上运行继承的方法的实现。

在此处发布了一种检查特定类的方法实现的简单方法: How to check if a class level method is in superclass or in subclass in Objective C?

答案 1 :(得分:-2)

我能够提出的最佳方式:

#define IMPL_CLASS MyClassName

@implementation IMPL_CLASS {
    // use IMPL_CLASS everywhere you want the implementation block
}

非常欢迎更好的答案。