请帮助我理解principalClass是用来做什么的?它的语法是什么?我知道它在NSBundle类中,但是我们可以为任何捆绑包创建它吗?它只针对可加载的捆绑包吗?请帮助我了解principalClass的概念。
谢谢你。
发布于 2009-12-28 12:37:09
捆绑包的“主类”仅仅是被标记为捆绑包的主类的Objective-C类,因此,将由捆绑包实例的-principalClass方法返回。
没有更多,也没有更少,也没有魔法。
它只存在于可加载的包中,因为只有可加载的包定义了新的Objective-C类。
发布于 2011-06-02 04:48:34
我将给你一个如何创建和加载一个包作为插件的例子。希望这会对你有很大的帮助。我必须说,我同意其他两个(到目前为止)的答案。所以..。
创建一个名为"Bundle“的Xcode项目(在Xcode 3.2.6中,位于New Project->Framework & Library->选择"Bundle")。创建以下文件...
PClass.h
#import <Foundation/Foundation.h>
@interface PClass : NSObject {
}
- (NSString*) stringMessage;
@endPClass.m
- (NSString*) stringMessage {
return @"Hallo from plugin";
}在项目.plist文件中,添加以下两个条目:
“捆绑显示名称”"MyPlugin“
“主体类”"PClass“
然后编译项目并将二进制文件(.../build/Debug/yourPlugin.bundle)移动到您喜欢的文件夹中,以保存您的项目的插件(可能要特别小心地复制到aProject.app/ plugins /中)。
然后将以下内容添加到已有的Xcode项目中:
- (void) loadPlugin {
id bundle = [NSBundle bundleWithPath:@"the path you/placed/yourPlugin.bundle"];
NSLog(@"%@", [[bundle infoDictionary] valueForKey:@"CFBundleDisplayName"]);
// Here you can preview your plugins names without loading them if you don't need to or just to
// display it to GUI, etc
NSError *err;
if(![bundle loadAndReturnError:&err]) {
// err
} else {
// bundle loaded
Class PluginClass = [bundle principalClass]; // here is where you need your principal class!
// OR...
//Class someClass = [bundle classNamed:@"KillerAppController"];
id instance = [[PluginClass alloc] init];
NSLog(@"%@", [instance stringMessage]);
[instance release]; // If required
[bundle unload]; // If required
}}
您刚刚通过其作为应用程序插件的主体类加载了一个包。
发布于 2010-01-09 08:53:34
一旦加载了包,principalClass就可以让您知道要开始使用哪个类。例如,假设您正在使用bundle来表示图像处理应用程序的插件。当您告诉Objective-C运行时加载包"CSISharpener.bundle“时,它会将一堆新类加载到内存中。但是,您仍然需要知道要向其发送消息的类的名称,以便实际使用该插件。
在我们的示例中,principalClass可能会返回CSISharpeningFilter,这符合我们告诉插件开发人员使用的插件协议。因此,我们可以创建"principalClass“的一个实例并开始使用它,而不需要提前知道类名是什么。
换句话说,principalClass的存在是为了让加载包的程序能够轻松地找到它们刚刚加载的代码的“入口点”。它的确切用途将取决于加载该包的代码以及它使用它的目的。
https://stackoverflow.com/questions/1967891
复制相似问题