2012-12-18 49 views
1

我正在爲我的應用程序構建可插入接口。我堅持使用插件的更新機制。裝載和卸載NSBundle

這是使我困惑的代碼。

- (void) unloadBundle{ 
    [_pluginInstance release], _pluginInstance = nil; 
    [[self bundle] unload]; 
    [_bundle release], _bundle = nil; 
} 

- (void) loadBundleWithURL:(NSURL *)bundleURL{ 
    NSBundle *newBundle = [NSBundle bundleWithURL:bundleURL]; 
    if (newBundle){ 
     [self setBundle:newBundle]; 
     [self setPluginInstance:[[[[self.bundle principalClass] alloc] init] autorelease]]; 

     NSLog(@"New bundle: %@", self.bundle); 
     NSLog(@"New bundle's principal class %@", [self.bundle principalClass]); 
     NSLog(@"Principal class' bundle is %@", [NSBundle bundleForClass:[self.bundle principalClass]]); 
     NSLog(@"Plugin's class %@", [self.pluginInstance class]); 
    } 
} 

這些是我的包裝在插件主體類中的方法。我只需撥打unloadBundle,然後撥打loadBundleWithURL,然後將URL指向新版本的捆綁包。執行時,它會記錄下到控制檯:

New bundle: NSBundle </Users/prudnikov/Work/Projects/***/Name.pluginextension> (loaded) 
New bundle's principal class MyPluginClass 
Principal class' bundle is NSBundle </Users/prudnikov/Library/Application Support/MyApp/PlugIns/Name.pluginextension> (not yet loaded) 
Plugin's class MyPluginClass 

,我主要採取從類新捆綁手段,得到它的同捆[NSBundle bundleForClass:],這是舊的包。

任何想法我做錯了什麼?

+0

這是什麼問題?什麼不適合你? –

+0

問題是我加載了新捆綁包,但它需要舊捆綁包中的主體類。我想卸載舊的捆綁包並開始使用新的捆綁包。 –

+0

我剛從頭創建了一個測試項目,看起來問題在我的代碼中。我會深入研究,看看有什麼不對。 –

回答

1

這種情況下的問題是我忘記了在不同的地方卸載軟件包。我有方法驗證捆綁是一個有效的插件捆綁。

調用principalClass自動加載軟件包。所以,打電話unload是必需的。