NSBundle的加载和卸载

Posted

技术标签:

【中文标题】NSBundle的加载和卸载【英文标题】:Loading and unloading of NSBundle 【发布时间】:2012-12-18 13:00:21 【问题描述】:

我正在为我的应用程序构建可插拔接口。我坚持使用插件的更新机制。

这是让我困惑的代码。

- (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:] 获取它的包,它是旧包。

任何想法我做错了什么?

【问题讨论】:

有什么问题?什么不适合你? 问题是我加载了新包,但它从旧包中获取了主体类。我想卸载旧包并开始使用新包。 我刚刚从头开始创建了一个测试项目,这似乎是我的代码中的问题。我会深入研究一下,看看有什么问题。 【参考方案1】:

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

调用principalClass 会自动加载包。所以,需要调用unload

【讨论】:

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

NSBundle - (尚未加载)错误

NSBundle 加载一个 NSViewController

NSBundle 未加载 - 目标 C

Retina 图形未从 NSBundle 加载

使用 NSBundle 加载我的资源

现有路径的 NSBundle“尚未加载”