Objective-C 类 -> 类似字符串:[NSArray className] -> @"NSArray"

Posted

技术标签:

【中文标题】Objective-C 类 -> 类似字符串:[NSArray className] -> @"NSArray"【英文标题】:Objective-C class -> string like: [NSArray className] -> @"NSArray" 【发布时间】:2011-01-20 21:05:21 【问题描述】:

我正在尝试从类对象本身获取类的字符串名称。

// For instance
[NSArray className]; // @"NSArray"

我找到了object_getClassName(id obj),但这需要将实例传递给它,而在我的情况下,这是不必要的工作。

那么我怎样才能从一个类对象中得到一个字符串,而不是一个实例呢?

【问题讨论】:

【参考方案1】:
NSString *name = NSStringFromClass ([NSArray class]);

你甚至可以反过来:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

【讨论】:

谢谢! NSStringFromClass 是如何实现的?将类名存储在static NSString 变量中是否更高效? @MattDiPasquale:所有类名都存储在 Objective-C 运行时的某个地方(运行时的内部大部分对应用程序隐藏,仅通过一些 API 函数公开)。每个类对象(例如[NSArray class])实际上是一个structstruct 包含很多关于类的信息,包括它的名称、它实现的方法、超类等。NSStringFromClass 只是从这个struct 中提取类的名称并将其转换为NSString .不要将类名存储在static NSString 中,它不会提供任何性能优势。 @MattDiPasquale:NSClassFromString 的工作方式有点不同。由于所有类名都存在于 Objective-C 运行时的某个地方,NSClassFromString 获取字符串并探索运行时维护的类列表,以查找具有给定名称的类。如果找到,则返回,否则返回Nil @MattDiPasquale:“NSStringFromClass 是如何实现的?”如果你真的想知道,它可能在运行时使用class_getName(),它返回一个C字符串 @AlexZavatone:className 是脚本扩展添加的一种方法,仅在 Mac OS X 上可用,即使那样它的工作方式也很挑剔,因为它没有完整记录(或至少这不是我最后一次检查)。 NSStringFromClass() 是正确的做法。【参考方案2】:

这是一种不同的方法,只需稍微少一点打字:

NSString *name = [NSArray description];

【讨论】:

不能保证按要求做。该方法通常被重写以提供对对象及其包含的数据的描述。 我知道它作为一种实例方法被覆盖,但是 +description CLASS METHOD 多久被覆盖一次?无论如何,如果不是每个班级都值得考虑......我认为不需要降级。 @SherwinZadeh:我认为在实践中,您不太可能找到覆盖+description 的类,但是,理论上这不是+description 的目的,因此这种方法很脆弱用于确定类名。【参考方案3】:

考虑这个替代方案:

const char *name = class_getName(cls);

它要快得多,因为它不必分配 NSString 对象并将 ASCII 转换为任何 NSString 表示形式。这就是NSStringFromClass() 的实现方式。

【讨论】:

这对我很有用,但需要在文件顶部添加#import

以上是关于Objective-C 类 -> 类似字符串:[NSArray className] -> @"NSArray"的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 中 Objective-C 的类似 JavaDoc 的文档? [复制]

在另一个类objective-c中保存一个类的实例

来自另一个类的 Objective-C 设置属性返回 Null

如何过滤 Objective-C 的 DTrace 输出?

Objective-C:(私有/公共属性)为外部类调用设置只读属性,为自调用设置只读属性

VS for Mac:本机链接失败,未定义Objective-C类:CPTAnimationDelegate