装载和卸载NSBundle

时间:2012-12-18 13:00:22

标签: objective-c cocoa 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]);
    }
}

这些是我的插件主要类的包装器的方法。我只需使用新版本捆绑包的URL调用unloadBundle然后调用loadBundleWithURL。执行时,将以下内容记录到控制台中:

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:]获取其捆绑包,并且它是旧捆绑包。

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:2)

在这种情况下的问题是我忘了在不同的地方卸载捆绑。我的方法是验证bundle是一个有效的插件包。

调用principalClass会自动加载包。因此,需要调用unload