Objective c 目的-C遗传
我刚开始学习Objective-C。我遇到了一个问题,我已经试了几个小时了。这是我的代码 A.h级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
#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
作为变量。我成功了