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。我明確地把它關掉了。
你爲什麼使用'retainCount'?我很驚訝,因爲您使用的是ARC,LLVM不會將其標記爲錯誤? – Abizern
@Abizern你是對的。 '-retainCount'看起來不贊成。所以我更新了代碼:)無論如何我沒有使用* ARC *。我明確地關閉了它('CLANG_ENABLE_OBJC_ARC = NO'),因爲它使得'EXC_BAD_ACCESS'從動態加載的包中調用代碼。 – Eonil
但是你正在使用具有特定含義的'@ autoreleasepool'。 – Abizern