所有 我正在尝试理解目标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]
答案 0 :(得分:2)
+initialize
并不打算用于类别,只能用于类本身。运行时可能会看到两个不同的+initialize
方法,并且因此而无法运行。请参阅NSObject类引用中的+initialize(特殊注意事项部分)。