我用[NSBundle load]
动态加载了一个类。并使用[NSBundle unload]
动态卸载它。无论如何,看起来这个班级在卸货后还活着。
我的代码是:
// 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 :(得分:1)
(更多的是评论而不是答案,但:)这是由于内部@autoreleasepool块,不是吗?您将无法从捆绑包中创建新实例,但您确实将已创建的实例保持为活动状态(否则,这会产生奇特的错误)。