当我执行下面的代码时,为什么我会收到底部列出的输出,我有点(实际上,很多)困惑。Insect 和 Mammal 实例应该是具有不同实例变量的两个独立对象。对 [super initAttributes] 的两个调用都应该独立地初始化每个实例,每个实例都通过了self。那么为什么昆虫和哺乳动物实例在显示时具有相同的值?似乎两个实例都指向内存中的同一个对象。
任何帮助将不胜感激。谢谢!
动物类
//Interface
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms;
-(void) display;
@end
//Implementation
#import "Animal.h"
@implementation Animal
NSString *name;
int legs, arms;
-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms
{
self = [super init];
if (self)
{
name = initName;
legs = initLegs;
arms = initArms;
}
return self;
}
-(void) display
{
NSLog(@"Name: %@ Legs: %i Arms: %i", name, legs, arms);
}
@end
昆虫类
//Interface
#import "Animal.h"
@interface Insect : Animal
-(id) initInsect: (NSString *) initName;
@end
//Implementation
#import "Insect.h"
@implementation Insect
-(id) initInsect: (NSString *) initName
{
self = [super initAttributes: initName Legs: 8 Arms: 0];
if (self)
{
}
return self;
}
@end
哺乳动物类
//Interface
#import "Animal.h"
@interface Mammal : Animal
-(id) initMammal: (NSString *) initName;
@end
//Implementation
#import "Mammal.h"
@implementation Mammal
-(id) initMammal: (NSString *) initName
{
self = [super initAttributes: initName Legs: 2 Arms: 2];
if (self)
{
}
return self;
}
@end
主要的
#import <Foundation/Foundation.h>
#import "Insect.h"
#import "Mammal.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
Insect *insect = [[Insect alloc] initInsect: @"Spydor"];
Mammal *mammal = [[Mammal alloc] initMammal: @"Platypus"];
[insect display];
[mammal display];
}
return 0;
}
输出
名称:鸭嘴兽腿:2 手臂:2
名称:鸭嘴兽腿:2 手臂:2