アプリケーション用のプラグ可能なインターフェイスを構築しています。プラグインの更新メカニズムに固執しました。
これが私を混乱させるコードです。
- (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:]
、それが古いバンドルであることを意味します。
私が間違っていることについて何か考えはありますか?