2011-09-24 5 views
2

클래스를 동적으로로드했습니다. [NSBundle load]. [NSBundle unload]으로 동적으로 언로드했습니다. 어쨌든 클래스가 언로드 한 후에도 여전히 생겼습니다.Cocoa에서 아직 언로드 된 클래스에 액세스 할 수있는 이유는 무엇입니까?

내 코드는 다음과 같습니다

// In separated bundle. 
@implementation EEExampleBundle 
+ (void)test 
{ 
    NSLog(@"TTTTT"); 
} 
@end 




// In executable file. 
#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool 
    { 
     id EEExampleBundle   = nil; 

     @autoreleasepool 
     { 
      NSString* path   = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"EEExampleBundle.framework"]; 
      NSBundle* sampleBundle = [NSBundle bundleWithPath:path]; 

      [sampleBundle load]; 


      EEExampleBundle  = (id)[sampleBundle classNamed:@"EEExampleBundle"]; 

      [EEExampleBundle test]; 

      BOOL r = [sampleBundle unload]; 
      NSLog(@"unload result = %d", r); 
     } 
     [EEExampleBundle test]; 
    } 
    return 0; 
} 

출력은 : 왜 클래스 코드는 여전히 작동하고

2011-09-25 01:08:52.713 driver[2248:707] TTTTT 
2011-09-25 01:08:52.714 driver[2248:707] unload result = 1 
2011-09-25 01:08:52.716 driver[2248:707] TTTTT 

? 이게 정상인가? 또는 코드를 완전히 언로드하려면 추가 단계를 수행해야합니까?

P.S ARC입니다. 나는 그것을 명시 적으로 해제했다.

+0

왜 'retainCount'를 사용하고 있습니까? ARC를 사용할 때 LLVM이 오류로 표시하지 않는다는 것에 놀랐습니다. – Abizern

+0

@Abizern 당신 말이 맞아요. '-retainCount'는 더 이상 사용되지 않습니다. 그래서 코드를 업데이트했습니다 :) 어쨌든 * ARC *를 사용하지 않았습니다. 동적으로로드 된 번들의 코드를 호출하는 EXC_BAD_ACCESS를 만들기 때문에 명시 적으로 해제했다 ('CLANG_ENABLE_OBJC_ARC = NO'). – Eonil

+0

그러나 특별한 의미를 지닌'@ autoreleasepool'을 사용하고 있습니다. – Abizern

답변

1

(답변보다 댓글이 많습니다. :) 내부 @autoreleasepool 블록 때문입니까? 번들에서 새 인스턴스를 만들 수는 없지만 이미 생성 된 인스턴스는 계속 유지합니다 (그렇지 않으면 멋진 버그가 생성됩니다).

관련 문제