ObjC Class Runtime Process + Initialize проблема? - PullRequest
1 голос
/ 08 апреля 2011

Все, что я пытаюсь понять, объективный процесс времени выполнения объекта C

Из ссылок на объекты будет вызван метод + 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 Ответ

2 голосов
/ 08 апреля 2011

+initialize не предназначен для использования категориями, только сами классы.Вполне возможно, что среда выполнения видит два разных метода +initialize и не запускается из-за этого.См. + initialize в справочнике классов NSObject (раздел «Особые соображения»).

...