我想知道实现块的名称。编译器提供
__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__) {...}
答案 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
}
非常欢迎更好的答案。