在Objective-C中动态加载类?

时间:2010-11-15 19:34:22

标签: iphone objective-c cocoa dynamic

有没有办法在运行时从Objective-C中的字符串#import类?任何会产生类似结果的方法也会受到欢迎。

编辑:

我想访问一个我在运行时确定其名称的类。所以像这样:

NSString *className = getClassName();
Class myClass = loadClass(className);
myClass *myVar = [[myClass alloc] init];

有没有办法在没有为文件顶部的myClass添加静态#import指令的情况下执行此操作?

3 个答案:

答案 0 :(得分:25)

您可以使用NSClassFromString方法。所以:

// Creates an instance of an NSObject and stores it in anObject
id anObject = [[NSClassFromString(@"NSObject") alloc] init];

更多示例代码以响应您的修改:

NSString* myClassString = getClassName();
// if the class doesn't exist, myClass will be Nil and myVar will be nil
Class* myClass = NSClassFromString(myClassString);
id myVar = [[myClass alloc] init];

答案 1 :(得分:5)

#import指令不“导入”一个类 - 它将指定文件中的文本插入到当前文件中。在编译源代码后,这显然在运行时没用。

您想要的是创建包含类和dynamically load the bundle的包。为了能够与核心程序中的类进行对话,您可能希望拥有捆绑类实现的一些通用协议。

答案 2 :(得分:0)

感谢Chuck指出我在正确的道路上,但这个查询的正确答案似乎是在iOS 4.1上是不可能的,尽管可以使用当前的Mac OSX SDK使用可加载的捆绑包。