2

アプリケーション用のプラグ可能なインターフェイスを構築しています。プラグインの更新メカニズムに固執しました。

これが私を混乱させるコードです。

- (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:]、それが古いバンドルであることを意味します。

私が間違っていることについて何か考えはありますか?

4

1 に答える 1

2

この場合の問題は、別の場所でバンドルをアンロードするのを忘れたことです。バンドルが有効なプラグインのバンドルであることを確認するメソッドがありました。

呼び出すprincipalClassと、バンドルが自動的にロードされます。したがって、呼び出しunloadが必要です。

于 2012-12-18T19:00:41.120 に答える