2012-12-18 3 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으로 전화해야합니다.

관련 문제