Objective c NSClassFromString()与ClassName:(NSString*)

Objective c NSClassFromString()与ClassName:(NSString*),objective-c,cocoa,dynamic,Objective C,Cocoa,Dynamic,从我所读到的内容来看,从类名获取对象似乎有两种方法。使用NSClassFromString()和NSBundle的classNamed:(NSString*)之间有什么区别?NSClassFromString()返回一个已在运行库中为给定名称注册的类。NSBundle的classNamed:返回包中具有给定名称的类,该类可能尚未加载(这意味着它将在必要时加载包) 但另一种方式是:NSBundle可能不知道应用程序运行时中加载的所有类(尽管如果它是您的主bundle,它可能知道您的大多数类)。相反

从我所读到的内容来看,从类名获取对象似乎有两种方法。使用
NSClassFromString()
NSBundle
classNamed:(NSString*)
之间有什么区别?

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


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

我怀疑
+classNamed:
会导致它被注册和加载。@bbum:是的,会的。已澄清。@bbum:
classNamed:
是实例方法(
-classNamed:
),而不是类方法。这给我带来了另一个区别:将
classNamed:
发送到bundle就是为类请求特定的bundle。如果该类不在该捆绑包中(因为它在另一个捆绑包中,或者因为它不存在),则会得到
Nil
NSClassFromString
将返回该类,无论该类由哪个包提供。耶——对。我几乎从不使用
classNamed:
,原因有几个。带有可选加载代码的捆绑包通常是浪费时间。无论如何,捆绑卸载实际上并不起作用(太脆弱,无法有效使用)。并且无论如何都不支持重复类,因此也就意味着无论如何都不存在“特定于包的类X版本”。最好将类视为运行时的同质部分,
principalClass
作为捆绑包的“挂钩”,并使用它来完成。