2012-12-18 48 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是必需的。