2009-12-28 57 views
4

Plz帮助我理解principalClass用于什么?它的语法是什么。我明白,它是在NSBundle类,但我们可以创建它的任何捆绑只是为了特定于可绑定的捆绑吗? PLZ帮助我了解principalClass的概念。NSBundle的主要类

感谢你。

回答

4

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

没有更多,没有什么更多,没有魔法。

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

+0

Thanku ..你可以给我任何使用principalClass的开源项目的链接。 – suse 2009-12-29 05:13:41

3

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

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

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

5

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

创建一个Xcode项目作为“Bundle”(在Xcode 3.2.6是在新建项目 - >框架& 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)移动到您喜欢的文件夹中,以便保留您的项目插件(可复制到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 
} 

}

你刚刚通过其主体类加载的束作为应用程序的插件。