Objective c 目标C:负荷“;图书馆;使用反射
我的任务是使用XCode for OSX创建一个应用程序。此应用程序需要能够加载和运行单独的“模块”,这些模块将动态确定(即,一个用户可能购买了模块1和2,而用户2可能购买了模块3和模块6——只有购买的模块应该“运行”) 在C#中,我将创建一个“库”项目(只编译成DLL)。当用户购买模块时,我会提供适当的DLL文件,然后我的应用程序会使用反射查找并加载/运行DLLObjective c 目标C:负荷“;图书馆;使用反射,objective-c,macos,dynamic,Objective C,Macos,Dynamic,我的任务是使用XCode for OSX创建一个应用程序。此应用程序需要能够加载和运行单独的“模块”,这些模块将动态确定(即,一个用户可能购买了模块1和2,而用户2可能购买了模块3和模块6——只有购买的模块应该“运行”) 在C#中,我将创建一个“库”项目(只编译成DLL)。当用户购买模块时,我会提供适当的DLL文件,然后我的应用程序会使用反射查找并加载/运行DLL 在XCode中与此等效的是什么?我可以创建一个“库”,然后使用反射加载它吗?请记住,应用程序无法事先了解模块,因为在某些情况下,用户
在XCode中与此等效的是什么?我可以创建一个“库”,然后使用反射加载它吗?请记住,应用程序无法事先了解模块,因为在某些情况下,用户甚至不会拥有模块文件。我看到了各种选项,如“Cocoa框架”和“Cocoa库”以及“C/C++库”。每一个选项都做什么?它们都可以完成我需要的工作吗?您可以创建一个包。Xcode为此提供了模板(称为“可加载包”,图标为乐高积木)。通常使用
NSBundle
的load
方法加载捆绑包
加载它的一个例子是:
- (BOOL)loadPluginAtURL:(NSURL *)URL {
NSBundle *pluginBundle = [NSBundle bundleWithURL:URL];
if (![pluginBundle load]) { // is false if pluginBundle == nil automatically.
return NO;
}
id plugin = nil;
@try { // Use @try-@catch in case the principle class doesn't respond to +alloc or -init. Otherwise the host application would crash and that kinda sucks.
plugin = [[pluginBundle principalClass] alloc] init]; // Set the principle class in the bundle's info plist.
} @catch (id e) {
[bundle unload];
return NO;
}
if (plugin) {
[self.loadedPlugins addObject:plugin];// Define this as an NSMutableSet object.
return YES;
}
[pluginBundle unload];
return NO;
}
您最终可以提供一个插件可以使用的框架,其中可以包括协议和类。例如,您可以检查bundle的Principal类是否是框架中特定类的子类,这样您就不会发送插件不响应的任何消息。我看到一个几乎透明的白色乐高积木,但它只显示“bundle”-我猜就是这个吗?创建“Url”的语法是什么样的要从与正在运行的应用程序位于同一位置的磁盘读取捆绑文件?