在Objective-C中动态加载类?

Jac*_*les 7 iphone cocoa dynamic objective-c

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

编辑:

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

NSString *className = getClassName();
Class myClass = loadClass(className);
myClass *myVar = [[myClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*oco 25

你可以使用NSClassFromString方法.所以:

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

还有一些示例代码可以响应您的编辑:

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];
Run Code Online (Sandbox Code Playgroud)


Chu*_*uck 5

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

你想要的是创建一个包与类,并动态加载包.为了能够与核心程序中的类进行通信,您可能希望拥有捆绑类实现的一些通用协议.

  • 当然,您无法动态加载iPhone的捆绑包. (5认同)
  • 当我偶然发现这个旧答案告诉未来的访客,即使以前不可能,现在自WWDC'14和iOS SDK 8.0以来,现在可以动态加载框架(但仅在部署iOS8 +时) - 作为一个注释只要动态框架嵌入在iOS应用程序包中. (2认同)