为什么在Cocoa中仍然可以访问卸载的类?

时间:2011-09-24 15:53:08

标签: objective-c cocoa

我用[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 。我明确地将其关闭了。

1 个答案:

答案 0 :(得分:1)

(更多的是评论而不是答案,但:)这是由于内部@autoreleasepool块,不是吗?您将无法从捆绑包中创建新实例,但您确实将已创建的实例保持为活动状态(否则,这会产生奇特的错误)。