2009-09-23 164 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