Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在Objective-C中动态加载类?_Iphone_Objective C_Cocoa_Dynamic - Fatal编程技术网

Iphone 在Objective-C中动态加载类?

Iphone 在Objective-C中动态加载类?,iphone,objective-c,cocoa,dynamic,Iphone,Objective C,Cocoa,Dynamic,有没有办法#在运行时从Objective-C中的字符串导入类?任何能产生类似结果的方法都是受欢迎的 编辑: 我想要访问在运行时确定其名称的类。比如说: NSString *className = getClassName(); Class myClass = loadClass(className); myClass *myVar = [[myClass alloc] init]; 有没有办法在不将myClass的静态#导入指令放在文件顶部的情况下执行此操作 您可以使用NSClassFromS

有没有办法#在运行时从Objective-C中的字符串导入类?任何能产生类似结果的方法都是受欢迎的

编辑:

我想要访问在运行时确定其名称的类。比如说:

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

有没有办法在不将myClass的静态#导入指令放在文件顶部的情况下执行此操作

您可以使用
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];
#import
指令不“导入”类-它将命名文件中的文本插入当前文件。在编译源代码后的运行时,这显然没有用处


您想要的是创建一个包含类和的包。为了能够与核心程序中的类进行对话,您可能需要一些捆绑类实现的通用协议。

感谢Chuck为我指出了正确的路径,但这个问题的正确答案似乎是,在iOS 4.1上不可能实现,尽管当前的Mac OSX SDK可以使用可加载的捆绑包

不幸的是,这看起来像是创建了一个nil实例,而我想创建一个myClass实例。也许这在Objective-C中是不可能的?在Python中,我可以根据应用程序逻辑在运行时动态加载模块。我希望在目标C中有一种方法可以做到这一点。@Jacob Lyles:
NSClassFromString()
如果没有找到这样的类,则返回nil。听起来你的类没有加载到应用程序中。在这种情况下,你可能想看看我的答案。@Jason Coco:你不能吗?NSBundle被记录为在iOS上工作。只要你不下载外部代码,我想你会没事的。看起来“可加载捆绑包”是我想要的,而且根据苹果的文档“iOS不支持创建和使用可加载捆绑包”。我猜苹果不希望人们像我想的那样在iOS上制作酷的动态框架,或者说苹果还不支持它。不,它们不起作用。您可以加载它们,但不能从中执行代码。它只是失败了,除非他们最近更新了它,因为他们开始允许解释代码。即使只是普通的旧NIB也无法从已加载的捆绑包中加载(尽管所有其他资源都可用,如图像或声音文件)。我偶然发现了这个旧答案,告诉未来的访问者,即使以前不可能,现在由于WWDC'14和iOS SDK 8.0,动态加载框架现在也成为可能(但仅在为iOS 8+部署时-只要动态框架嵌入到iOS应用程序包中。您在哪里提到您询问iOS 4.1的问题