首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSBundle的主要类

NSBundle的主要类
EN

Stack Overflow用户
提问于 2009-12-28 11:54:32
回答 3查看 3.1K关注 0票数 6

请帮助我理解principalClass是用来做什么的?它的语法是什么?我知道它在NSBundle类中,但是我们可以为任何捆绑包创建它吗?它只针对可加载的捆绑包吗?请帮助我了解principalClass的概念。

谢谢你。

EN

回答 3

Stack Overflow用户

发布于 2009-12-28 12:37:09

捆绑包的“主类”仅仅是被标记为捆绑包的主类的Objective-C类,因此,将由捆绑包实例的-principalClass方法返回。

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

它只存在于可加载的包中,因为只有可加载的包定义了新的Objective-C类。

票数 7
EN

Stack Overflow用户

发布于 2011-06-02 04:48:34

我将给你一个如何创建和加载一个包作为插件的例子。希望这会对你有很大的帮助。我必须说,我同意其他两个(到目前为止)的答案。所以..。

创建一个名为"Bundle“的Xcode项目(在Xcode 3.2.6中,位于New Project->Framework & Library->选择"Bundle")。创建以下文件...

PClass.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>
@interface PClass : NSObject {

}

- (NSString*) stringMessage;

@end

PClass.m

代码语言:javascript
复制
- (NSString*) stringMessage {
    return @"Hallo from plugin";
}

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

“捆绑显示名称”"MyPlugin“

“主体类”"PClass“

然后编译项目并将二进制文件(.../build/Debug/yourPlugin.bundle)移动到您喜欢的文件夹中,以保存您的项目的插件(可能要特别小心地复制到aProject.app/ plugins /中)。

然后将以下内容添加到已有的Xcode项目中:

代码语言:javascript
复制
- (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
}

}

您刚刚通过其作为应用程序插件的主体类加载了一个包。

票数 7
EN

Stack Overflow用户

发布于 2010-01-09 08:53:34

一旦加载了包,principalClass就可以让您知道要开始使用哪个类。例如,假设您正在使用bundle来表示图像处理应用程序的插件。当您告诉Objective-C运行时加载包"CSISharpener.bundle“时,它会将一堆新类加载到内存中。但是,您仍然需要知道要向其发送消息的类的名称,以便实际使用该插件。

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

换句话说,principalClass的存在是为了让加载包的程序能够轻松地找到它们刚刚加载的代码的“入口点”。它的确切用途将取决于加载该包的代码以及它使用它的目的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1967891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档