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입니다. 나는 그것을 명시 적으로 해제했다.
왜 'retainCount'를 사용하고 있습니까? ARC를 사용할 때 LLVM이 오류로 표시하지 않는다는 것에 놀랐습니다. – Abizern
@Abizern 당신 말이 맞아요. '-retainCount'는 더 이상 사용되지 않습니다. 그래서 코드를 업데이트했습니다 :) 어쨌든 * ARC *를 사용하지 않았습니다. 동적으로로드 된 번들의 코드를 호출하는 EXC_BAD_ACCESS를 만들기 때문에 명시 적으로 해제했다 ('CLANG_ENABLE_OBJC_ARC = NO'). – Eonil
그러나 특별한 의미를 지닌'@ autoreleasepool'을 사용하고 있습니다. – Abizern