1

客観的な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]
4

1 に答える 1

2

+initializeカテゴリで使用するためのものではなく、クラス自体でのみ使用するためのものです。ランタイムが 2 つの異なる+initializeメソッドを認識し、そのためにどちらも実行されない可能性があります。NSObject のクラス リファレンス (「特別な考慮事項」セクション) の+initializeを参照してください。

于 2011-04-08T01:27:09.073 に答える