NSBundle的主要类

时间:2009-12-28 03:54:32

标签: iphone nsbundle

Plz帮助我理解principalClass的用途是什么?它的语法是什么。我理解它是在NSBundle类中,但我们可以为任何捆绑创建它是否仅适用于可萝卜捆绑? plz帮助我了解principalClass的概念。

感谢你。

3 个答案:

答案 0 :(得分:6)

我将举例说明如何创建和加载包作为插件。希望这对你有很大的帮助。我必须说我同意其他2个(迄今为止)的答案。所以......

创建一个Xcode项目为“Bundle”(在Xcode 3.2.6中是New Project-> Framework& Library-> select“Bundle”)。创建以下文件...

PClass.h

#import <Foundation/Foundation.h>
@interface PClass : NSObject {

}

- (NSString*) stringMessage;

@end

PClass.m

- (NSString*) stringMessage {
    return @"Hallo from plugin";
}

在项目.plist文件中添加以下两个条目:

“捆绑显示名称”“MyPlugin”

“校长班级”“PClass”

然后编译项目并将二进制文件(... / build / Debug / yourPlugin.bundle)移动到您喜欢的文件夹中,以保存您项目的插件(可以将其复制到项目.Plagins /中一点额外的照顾)。

然后到已经在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
}

}

您刚刚通过其Principal Class加载了一个bundle作为应用程序的插件。

答案 1 :(得分:4)

bundle的“主要类”只是Objective-C类,它被标记为bundle的主类,因此将由bundle实例的-principalClass方法返回。

没有更多,没有更少,也没有魔力。

它仅适用于可加载的bundle,因为只有可加载的bundle定义了新的Objective-C类。

答案 2 :(得分:3)

principalClass允许您在加载包后知道要开始使用的类。例如,假设您使用捆绑包来表示图像处理应用程序的插件。当您告诉Objective-C运行时加载包“CSISharpener.bundle”时,它会将一堆新类加载到内存中。但是,您仍然需要知道要发送消息的类的名称,以便实际使用插件。

在我们的示例中,principalClass可能会返回CSISharpeningFilter,这符合我们告诉插件开发人员使用的插件协议。所以我们可以创建一个“principalClass”实例并开始使用它,而不必提前知道类名是什么。

换句话说,principalClass允许加载包的程序以及在他们刚刚加载的代码中找到“入口点”的简单方法。它究竟用于什么,取决于加载bundle的代码以及使用它的内容。