2009-09-23 163 views
0

我注意到,在今天玩耍的时候,下面两个对象在发送“init”时向控制台输出相同的消息“_init:TireSnow”。任何人都可以阐明为什么会发生这种情况?对象/类混乱?

// INTERFACE 
@interface TireBasic : NSObject { 
} 
@end 

@interface TireSnow : TireBasic { 
} 
@end 
// IMPLEMENT 
@implementation TireBasic 
- (id) init { 
    self = [super init]; 
    if(self) { 
     NSLog(@"TB_init: %@", NSStringFromClass([self class])); 
    } 
    return self; 
} 
- (NSString *) description { 
return @"This is a BASIC TIRE."; 
} 
@end 

@implementation TireSnow 
- (id) init { 
    self = [super init]; 
    if(self) { 
     NSLog(@"TS_init: %@", NSStringFromClass([self class])); 
    } 
    return self; 
} 
- (NSString *) description { 
return @"This is a SNOW TIRE."; 
} 

@end 

EDIT2 - 添加了所有的main()

#import <Foundation/Foundation.h> 
#import "CarParts.h" 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int tireCount; 
    CarClass *newCar_001; 
    EngineClass *newEngine_001; 
    TireBasic *newTire_BASIC; 
    TireSnow *newTire_SNOW; 

    // Setup 
    NSLog(@"COMPOSITION Start"); 
    newCar_001 = [[CarClass alloc] init]; 

    // Engine 
    newEngine_001 = [[EngineClass alloc] init]; 
    [newCar_001 setEngine: newEngine_001]; 

    // TIRES (BASIC) 
    for(tireCount=0; tireCount<2; tireCount++) { 
     newTire_BASIC = [[TireBasic alloc] init]; 
     [newCar_001 setTire:newTire_BASIC]; 
     [newTire_BASIC release]; 
    } 
    // TIRES (SNOW) 
    for(tireCount=0; tireCount<2; tireCount++) { 
     newTire_SNOW = [[TireSnow alloc] init]; 
     [newCar_001 setTire:newTire_SNOW]; 
     [newTire_SNOW release]; 
    } 
    // Display 
    [newCar_001 printCar]; 

    // Clean up 
    [newCar_001 release]; 
    [newEngine_001 release]; 
    [pool drain]; 
    return 0; 
} 

输出

> COMPOSITION Start 
> _init: CarClass 
> _init: EngineClass 
> TB_init: TireBasic 
> TB_init: TireBasic 
> TB_init: TireSnow ***** 
> TS_init: TireSnow 
> TB_init: TireSnow ***** 
> TS_init: TireSnow 
> 
> This is a BASIC TIRE. 
> This is a BASIC TIRE. 
> This is a SNOW TIRE. 
> This is a SNOW TIRE. 
> 
> _deal: CarClass 
> TB_deal: TireBasic 
> TB_deal: TireBasic 
> TS_deal: TireSnow 
> TB_deal: TireSnow ****** 
> TS_deal: TireSnow 
> TB_deal: TireSnow ****** 
> _deal: EngineClass 

与星线从TireSnow [超级的init]和[超级的dealloc]到来,似乎是每次都返回“TireSnow”的[self class],任何人都可以解释为什么?

千恩万谢

加里

回答

3
> TS_deal: TireSnow 
> TB_deal: TireSnow 

你问为什么TireSnow打印两次?

首先运行[TireBasic init],然后运行[TireSnow init]。在这两种情况下,他们都会打印班级名称,并且在两种情况下班级名称都是TireSnow

换句话说,[self class]总是会返回相同的对象,不管它是在执行该方法。

+0

换句话说,如果对象是一个TireSnow,然后'自class' *应该*每次都返回TireSnow。 – Chuck 2009-09-23 23:42:57

+0

我现在明白了,我对自己感到困惑,因为我在[TireBasic init]中都有NSLog语句;和[TireSnow init];我错误的地方在于即使[TireBasic init]正在执行,该方法现在属于(即由TireSnow继承),因此对[self class]的任何调用总是返回TireSnow。 – fuzzygoat 2009-09-24 12:07:46

0

我们可以看一下你的[[_____的alloc]初始化]声明?我看不到

[[TireSnow alloc] init]和[[TireBasic alloc] init]会返回相同的结果。好吧,也许如果:

TireSnow *tire; 

tire = (TireSnow *) [TireBasic alloc]; 
tire = [tire init]; 
1

TireSnow将在TireSnow初始化从调用超,在TireBasic初始化登录同级车两次,一次一次。

只是为了检查:你是否可能将来自TireSnow的两个日志与来自TireBasic和TireSnow的混淆?

+0

可能是... – fuzzygoat 2009-09-23 22:12:41