ObjC类运行时进程+初始化问题?

时间:2011-04-08 01:19:33

标签: objective-c objective-c-runtime

所有 我正在尝试理解目标C对象运行时进程

从Object Refs中,当第一个调用某个方法时,将调用该对象的+ Initialize方法。我运行如下测试文件。我想知道为什么这些对象只调用了+ load。


// InitializeTest.h
@interface InitializeTest : NSObject {
@private
}
- (void) show;
@end


@interface InitializeTest(Category)
+ (void) load;
+ (void) initialize;
@end


@interface InitializeTestSub : InitializeTest {
@private
}
- (void) showSub;
@end

@interface InitializeTestSub(Category)
+ (void) load;
+ (void) initialize;
@end


//InitializeTest.m
#import "InitializeTest.h"

@implementation InitializeTest
+ (void) load {
    NSLog(@"%s %@",__func__,self);
}

+ (void) initialize {
    NSLog(@"%s %@",__func__,self);
}

- (void) show {
    NSLog(@"%s",__func__);
}
@end


@implementation InitializeTest(Category)
+ (void) load {
    NSLog(@"Category %s %@",__func__,self);
}

+ (void) initialize {
    NSLog(@"Category %s %@",__func__,self);
}
@end


@implementation InitializeTestSub
+ (void) load {
    NSLog(@"%s %@",__func__,self);
}

+ (void) initialize {
    NSLog(@"%s %@",__func__,self);
}

- (void) showSub {
    NSLog(@"%s",__func__);
}
@end

@implementation InitializeTestSub(Category)
+ (void) load {
    NSLog(@"Category %s %@",__func__,self);
}

+ (void) initialize {
    NSLog(@"Category %s %@",__func__,self);
}
@end

//test Code
    InitializeTest* test = [[InitializeTest alloc] init];
    InitializeTestSub *testSub = [[InitializeTestSub alloc] init];

    [test class];
    [testSub class];


    [test show];
    [testSub show];
    [testSub showSub];

//////////////////////////////////////////////////
//Result
+[InitializeTest load] InitializeTest
+[InitializeTestSub load] InitializeTestSub
Category +[InitializeTest(Category) load] InitializeTest
Category +[InitializeTestSub(Category) load] InitializeTestSub
-[InitializeTest show]
-[InitializeTest show]
-[InitializeTestSub showSub]

1 个答案:

答案 0 :(得分:2)

+initialize并不打算用于类别,只能用于类本身。运行时可能会看到两个不同的+initialize方法,并且因此而无法运行。请参阅NSObject类引用中的+initialize(特殊注意事项部分)。