2011-09-24 51 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 

爲什麼類代碼仍然是工作?這是正常的嗎?或者我應該做任何額外的步驟來徹底卸載代碼?我不使用ARC。我明確地把它關掉了。

+0

你爲什麼使用'retainCount'?我很驚訝,因爲您使用的是ARC,LLVM不會將其標記爲錯誤? – Abizern

+0

@Abizern你是對的。 '-retainCount'看起來不贊成。所以我更新了代碼:)無論如何我沒有使用* ARC *。我明確地關閉了它('CLANG_ENABLE_OBJC_ARC = NO'),因爲它使得'EXC_BAD_ACCESS'從動態加載的包中調用代碼。 – Eonil

+0

但是你正在使用具有特定含義的'@ autoreleasepool'。 – Abizern

回答

1

(更多評論比答案,但:)但這是由於內部@autoreleasepool塊,不是?你不能從你的包中創建一個新的實例,但是你確實保留了已經創建的實例(否則會產生很多奇怪的錯誤)。

相關問題