NSClassFromString()vs classNamed:(NSString*)

Jus*_*tin 6 cocoa dynamic objective-c

根据我的阅读,似乎有两种方法可以从类名中获取对象.使用NSClassFromString()NSBundle's 之间有什么区别classNamed:(NSString *)

Chu*_*uck 7

NSClassFromString()返回已在运行时注册给定名称的类.NSBundle classNamed:将返回类中包含给定名称的类,该类可能尚未加载(这意味着它将在必要时加载该包).

但是另一种方式:NSBundle可能不知道应用程序运行时中加载的所有类(尽管它是你的主要包,它可能知道你的大多数类).相反,应用程序的运行时在加载之前不会知道包中的所有类.

  • 我怀疑`+ classNamed:`会导致它被注册和加载. (2认同)
  • @bbum:`classNamed:`是一个实例方法(`-classNamed:`),而不是类方法.这带来了另一个不同之处:将"classNamed:"发送到一个包就要求*该类的特定包*.如果该类不在该包中(因为它在另一个包中或因为它不存在),则会得到"Nil".`NSClassFromString`将返回该类,无论它提供什么包. (2认同)
  • 是的 - 对.我几乎从不使用`classNamed:`有几个原因.带有可选加载代码的捆绑包通常是浪费时间.无论如何,捆绑卸载并不真正起作用(太脆弱而无法有效使用).无论如何都不支持重复的类,因此无论如何都没有"类X的特定于bundle的版本".最好将类视为运行时的同类部分,`principalClass`作为bundle的"hook",并完成它. (2认同)