我注意到,在今天玩耍的時候,下面兩個對象在發送「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],任何人都可以解釋爲什麼?
千恩萬謝
加里
換句話說,如果對象是一個TireSnow,然後'自class' *應該*每次都返回TireSnow。 – Chuck 2009-09-23 23:42:57
我現在明白了,我對自己感到困惑,因爲我在[TireBasic init]中都有NSLog語句;和[TireSnow init];我錯誤的地方在於即使[TireBasic init]正在執行,該方法現在屬於(即由TireSnow繼承),因此對[self class]的任何調用總是返回TireSnow。 – fuzzygoat 2009-09-24 12:07:46