Objective c 目的-C遗传

Objective c 目的-C遗传,objective-c,inheritance,Objective C,Inheritance,我刚开始学习Objective-C。我遇到了一个问题,我已经试了几个小时了。这是我的代码 A.h级 #import <Foundation/Foundation.h> // The ClassA Class // @interface section @interface ClassA: NSObject { NSMutableArray *x; } @property (copy,nonatomic) NSMutableArray *x; - (void) initVa

我刚开始学习Objective-C。我遇到了一个问题,我已经试了几个小时了。这是我的代码

A.h级

#import <Foundation/Foundation.h>

// The ClassA Class

// @interface section
@interface ClassA: NSObject
{
    NSMutableArray *x;
}
@property (copy,nonatomic) NSMutableArray *x;
- (void) initVar;
- (void) print;
- (void) addStr: (NSString *) str;
@end
B.h类

#import "ClassA.h"

// The ClassB Class

// @interface section
@interface ClassB: ClassA
{
    NSMutableArray *y;
}
- (void) initVar;
- (void) print;
- (void) addStr: (NSString *) str;
@end
B.m级

#import "ClassB.h"

// @implementation section
@implementation ClassB

- (void) initVar
{
    y = [[NSMutableArray alloc] init];
}

- (void) print
{ 
    for(NSString *str in y)
        NSLog (@" />>>>>>>>> %@", str);
}

- (void) addStr: (NSString *) str
{
    if(![self.x containsObject: str] && ![y containsObject: str])
    {
        [self.x addObject: str];
        [y addObject: str];
    }
    else if([self.x containsObject: str] && ![y containsObject: str])
    {
        [y addObject: str];
    }
}

@end
这是我给班级打电话的地方

#import "./MyClasses/ClassB.h"

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

    NSLog (@"This will print!");
    ClassB *b = [[ClassB alloc] init];
    ClassA *a = [[ClassA alloc] init];

    [a initVar];
    [a addStr: @"obj1"];
    [a addStr: @"obj2"];
    [a addStr: @"obj3"];
    [a print];

    [b initVar];
    [b addStr: @"YOH1"];
    [b addStr: @"YOH2"];
    [b addStr: @"YOH3"];
    [b print];

    NSLog (@" +++++++++++++++++++++++++++++++++ ");

    [a print];

    [a release];
    [b release];
        [pool drain];
        return 0;
}

我想它的输出是这样的

这会打印出来的! ------------obj1

------------obj2

------------obj3

/>>>>>>>>>>>>YOH1

/>>>>>>>>>>>>YOH2

/>>>>>>>>>>>>YOH3

++++++++++++++++++++++++++++++++++++

------------obj1

------------obj2

------------obj3

------------YOH1

------------YOH2

------------YOH3



当前未显示最后3个输出(YOH1、YOH2和YOH3)。这意味着我没有成功地将对象添加到
x
。我做错了什么?

所以“b”对象在“x”中甚至没有NSMutableArray对于对象“b”,x'将为零

但我怀疑这里有不同的误解。对象“b”和对象“a”是两个不同的对象。仅仅因为类B是类a的子类,并不意味着将字符串添加到类B的某个实例就等于将这些字符串添加到类a的某个其他实例

为了回答评论中的问题,假设您确实希望类B的每个实例在“x”中都有自己的NSMutableArray。您可以这样做:

// in ClassA.h
@interface ClassA: NSObject {
   NSMutableArray *x;
}

@property (retain,nonatomic) NSMutableArray *x;
@end

// in ClassA.m

@implementation ClassA
@synthesize x;

- (id)init {
    if ((self = [super init])) {

      x = [[NSMutableArray alloc] init];
      // whenever we init an instance of class A, we will have
      // an nsmutablearray in 'x'
    }
    return self;
}

- (void)dealloc {

   // assume you aren't using ARC
   [x release];
   [super dealloc];
 }

// in ClassB.h
@interface ClassB: ClassA {
   NSMutableArray *y;
}

@property (retain,nonatomic) NSMutableArray *y; // for consistency
@end

// in ClassB.m

@implementation ClassB
@synthesize y;

- (id)init {
    if ((self = [super init])) { // call Class A's init

      y = [[NSMutableArray alloc] init];
      // whenever we init an instance of class B, we will have
      // everything an instance of A has, plus this y we need
    }
    return self;
}

- (void)dealloc {

    // assume you aren't using ARC
    [y release];
    [super dealloc];
}
我将您的initVar移动到一个适当的init中,没有理由在那里有两个方法。我只显示了init,没有显示addString和print

现在你可以这样做了:

ClassB*instanceOfB=[[ClassB alloc]init]

该实例将同时具有所需的x和y数组

我把实例变量声明也放在那里了,尽管新的编译器并不严格要求它们。较新的编译器版本可以隐式定义这些实例变量。如果你不明白这一点,现在不要担心。没那么重要


我希望这会有所帮助。

因此“b”对象在“x”中甚至没有NSMutableArray对于对象“b”,x'将为零

但我怀疑这里有不同的误解。对象“b”和对象“a”是两个不同的对象。仅仅因为类B是类a的子类,并不意味着将字符串添加到类B的某个实例就等于将这些字符串添加到类a的某个其他实例

为了回答评论中的问题,假设您确实希望类B的每个实例在“x”中都有自己的NSMutableArray。您可以这样做:

// in ClassA.h
@interface ClassA: NSObject {
   NSMutableArray *x;
}

@property (retain,nonatomic) NSMutableArray *x;
@end

// in ClassA.m

@implementation ClassA
@synthesize x;

- (id)init {
    if ((self = [super init])) {

      x = [[NSMutableArray alloc] init];
      // whenever we init an instance of class A, we will have
      // an nsmutablearray in 'x'
    }
    return self;
}

- (void)dealloc {

   // assume you aren't using ARC
   [x release];
   [super dealloc];
 }

// in ClassB.h
@interface ClassB: ClassA {
   NSMutableArray *y;
}

@property (retain,nonatomic) NSMutableArray *y; // for consistency
@end

// in ClassB.m

@implementation ClassB
@synthesize y;

- (id)init {
    if ((self = [super init])) { // call Class A's init

      y = [[NSMutableArray alloc] init];
      // whenever we init an instance of class B, we will have
      // everything an instance of A has, plus this y we need
    }
    return self;
}

- (void)dealloc {

    // assume you aren't using ARC
    [y release];
    [super dealloc];
}
我将您的initVar移动到一个适当的init中,没有理由在那里有两个方法。我只显示了init,没有显示addString和print

现在你可以这样做了:

ClassB*instanceOfB=[[ClassB alloc]init]

该实例将同时具有所需的x和y数组

我把实例变量声明也放在那里了,尽管新的编译器并不严格要求它们。较新的编译器版本可以隐式定义这些实例变量。如果你不明白这一点,现在不要担心。没那么重要


我希望这会有所帮助。

但是您没有将YOH1、YOH2和YOH3添加到
a
,是吗


另外,
x
不会为类B初始化。

但是您没有将YOH1、YOH2和YOH3添加到
a
,对吗


另外,
x
不会为classB初始化。

这就是我要做的。嗯,我应该怎么做才能将字符串添加到类A中?为类B初始化
x
不是要在内存中分配另一个空间,而不是由类A的
x
占用的空间吗?因此我认为您将类与对象(这些类的实例)混淆了。我建议你读一读。名为“b”的对象与“a”的对象不同。因此,是的,它当然需要自己的内存来存储数组“x”。如果您创建了类A的另一个实例,或者甚至是“a26”,那么对象“a1”也会这样。任何类的每个实例(对象)都需要自己的内存作为实例变量。您可以创建100个A类实例,您将拥有100个名为“x”的NSMutableArray。每个实例一个。好的,阅读第3章和第8章。但在使用NSMutableArray作为实例变量之前,我使用
intx
作为变量。我成功地打印并给它赋值。为什么?什么的第三章和第八章?如果您有一个实例变量(ivar),它是像int这样的基本类型,那么您不需要分配一个int来放入其中。该int(32位或其他)是每个对象结构的一部分,将为您初始化为零。但是,在一个对象上设置int不会影响其他对象。所以这个概念还是一样的。每个物体都是它自己的东西。就像你和我一样,我们是同一类人的不同实例。我可以把我的眼睛伸出来,你的眼睛也会没事的。这就是我要做的。嗯,我应该怎么做才能将字符串添加到类A中?为类B初始化
x
不是要在内存中分配另一个空间,而不是由类A的
x
占用的空间吗?因此我认为您将类与对象(这些类的实例)混淆了。我建议你读一读。名为“b”的对象与“a”的对象不同。因此,是的,它当然需要自己的内存来存储数组“x”。如果您创建了类A的另一个实例,或者甚至是“a26”,那么对象“a1”也会这样。任何类的每个实例(对象)都需要自己的内存作为实例变量。您可以创建100个A类实例,您将拥有100个名为“x”的NSMutableArray。每个实例一个。好的,阅读第3章和第8章。但在使用NSMutableArray作为实例变量之前,我使用
intx
作为变量。我成功了