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

Ale*_*yne 128 reflection metaprogramming objective-c objective-c-runtime

我试图从类对象本身获取类的字符串名称.

// For instance
[NSArray className]; // @"NSArray"
Run Code Online (Sandbox Code Playgroud)

我发现object_getClassName(id obj)但是需要将一个实例传递给它,在我的情况下这是不必要的工作.

那么如何从类对象中获取字符串,而不是实例呢?

dre*_*lax 305

NSString *name = NSStringFromClass ([NSArray class]);
Run Code Online (Sandbox Code Playgroud)

你甚至可以回到另一个方向:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

  • @MattDiPasquale:所有类名都存储在Objective-C运行时的某个位置(运行时的内部大部分是从应用程序隐藏的,只能通过一些API函数公开).每个类对象(例如`[NSArray class]`)实际上是一个`struct`.`struct`包含有关该类的大量信息,包括它的名称,它实现的方法,超类等.`NSStringFromClass`只是从这个`struct`中提取类的名称并将其转换为`NSString` .不要将类名存储在`静态NSString`中,它不会提供任何性能优势. (13认同)
  • @MattDiPasquale:`NSClassFromString`的工作方式略有不同.由于所有类名都存在于Objective-C运行时中,因此`NSClassFromString`接受字符串并探索运行时维护的类列表,以查找具有给定名称的类.如果找到它,则返回它,否则返回"Nil". (3认同)
  • @MattDiPasquale:"NSStringFromClass是如何实现的?" 如果你真的想知道,它可能在运行时使用`class_getName()`,它返回一个C字符串 (2认同)
  • @AlexZavatone:`className`是脚本扩展添加的一个方法,仅在Mac OS X上可用,即使这样它的工作原理也很挑剔,因为它没有完全记录(或者至少它不是我最后一次选中).`NSStringFromClass()`是正确的方法. (2认同)