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]
)实际上是一个struct
。 struct
包含很多关于类的信息,包括它的名称、它实现的方法、超类等。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 设置属性返回 Null