2009-12-28 30 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 
} 

}

你剛剛通過其主體類加載的束作爲應用程序的插件。