いくつかのテストを追加するためだけに:
2 つの MyClass クラスを作成しました: NSObject -> Myclass -> My2ndClass
そう:
@implementation Myclass
+(id) sharedClass {
static Myclass *miclase = nil;
miclase = [[self alloc] init];
NSLog(@"%@", [super description]);
return miclase;
}
-(id)init {
self = [super init];
NSLog(@"init de Myclass");
return self;
}
-(NSString *)description {
return @"i am Myclass";
}
@end
と:
@implementation My2ndClass
+(id) sharedClass {
static My2ndClass *miclase = nil;
miclase = [[super alloc] init];
//miclase = [super init]; CRASH
NSLog(@"%@", [super description]);
return miclase;
}
-(id)init {
self = [super init];
NSLog(@"init de My2ndClass");
NSLog(@"%@", [super description]);
return self;
}
-(NSString *)description {
return @"i am My2ndClass";
}
@end
次にAppDelegateで:
Myclass *miclase = [Myclass sharedClass];
My2ndClass *mi2ndclase = [My2ndClass sharedClass];
これはコンソール出力です:
2012-09-03 17:18:55.742 Dynamic Typing[2891:207] init de Myclass
2012-09-03 17:18:55.744 Dynamic Typing[2891:207] Myclass
2012-09-03 17:18:55.746 Dynamic Typing[2891:207] init de Myclass
2012-09-03 17:18:55.747 Dynamic Typing[2891:207] init de My2ndClass
2012-09-03 17:18:55.748 Dynamic Typing[2891:207] i am Myclass
2012-09-03 17:18:55.751 Dynamic Typing[2891:207] My2ndClass
xlc0212 が言ったように、ネストされている場合の正しいメッセージは次のとおりです。
miclase = [super alloc];
miclase = [miclase init];
その上、もし私がするなら
miclase = [super alloc]
その後
miclase = [super init]
クラッシュします。
クラスメソッド (+) [スーパーディスクリプション] が送信されると、クラス名 (Myclass および My2ndClass) がログに記録されます。それらはクラスそのものであり、スーパー オブジェクトを持っていませんね。