NSBundle 的主体类

Posted

技术标签:

【中文标题】NSBundle 的主体类【英文标题】:principal class of NSBundle 【发布时间】:2009-12-28 03:54:31 【问题描述】:

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

谢谢你。

【问题讨论】:

【参考方案1】:

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

不多也不少,没有魔法。

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

【讨论】:

谢谢..你能给我任何使用principalClass的开源项目的链接吗?【参考方案2】:

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

创建一个 Xcode 项目作为“Bundle”(在 Xcode 3.2.6 中是在 New Project->Framework & Library-> 选择“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) 移动到您希望保留项目插件的文件夹中(可以复制到 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

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

【讨论】:

【参考方案3】:

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

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

换句话说,principalClass 允许加载包的程序和简单的方法来找到他们刚刚加载的代码的“入口点”。它的确切用途将取决于加载包的代码以及它的用途。

【讨论】:

以上是关于NSBundle 的主体类的主要内容,如果未能解决你的问题,请参考以下文章

NSBundle 中的类

如何探索 NSBundle 内容?

NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?

更新 Cocoapods gem 后,测试中的类似乎是从不同的 NSBundle 加载的,导致零单例

无法在 iphone 单元测试中从 NSBundle 加载文件

NSBundle