2014-01-23 35 views
-1

我开始学习Objective-C的基础知识,目前正在阅读Kochan的(Progamming Objective C)。Objective C继承和语法

我被困在继承主题。

我有2个类和1个子类,XYPoint和矩形,正方形(正方形是矩形的子类)。

我有方法可以保留矩形对象的值X和Y坐标。

,这里是我的main.m文件

#import <Foundation/Foundation.h> 
#import "Rectangle.h" 
#import "Square.h" 
#import "XYPoint.h" 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     Square *square1 = [[Square alloc]init]; 
     XYPoint *myPoint = [[XYPoint alloc]init]; 

     [myPoint setX:33 andY:33]; 

     [square1 setOrigin:myPoint]; 

     [myPoint setX:25 andY:25]; 
     NSLog(@"square1 origin is %i and %i",[[square1 origin]x],[[square1 origin]y]); 
     [myPoint setX:125 andY:125]; 

     NSLog(@"square1 origin is %i and %i",[[square1 origin]x],[[square1 origin]y]); 

     [myPoint setX:25 andY:25]; 
     NSLog(@"square1 origin is %i and %i",[[square1 origin]x],[[square1 origin]y]); 


    } 
    return 0; 
} 

和我Rectangle.m

-(void) setOrigin:(XYPoint *)pt{ 


     if (!origin) 
     origin = [[XYPoint alloc]init]; 

     origin.x = pt.x; 
     origin.y = pt.y; 

} 

-(XYPoint *)origin { 
    return origin; 
} 

和XYPoint.m文件从该计划

- (void) setX:(int)xVal andY: (int) yVal{ 


    x = xVal; 
    y = yVal; 

} 

输出是:

2014-01-23 15:25:36.368 Rectangle1[4356:303] square1 origin is 33 and 33 
2014-01-23 15:25:36.370 Rectangle1[4356:303] square1 origin is 33 and 33 
2014-01-23 15:25:36.370 Rectangle1[4356:303] square1 origin is 33 and 33 

NSLogged 3次。这种保留方法-(void) setOrigin:(XYPoint *)pt; 有助于保留矩形对象上的XY值,甚至通过setX和Y方法重新设置XY值。

,但是当我改变了保留方法为这样:

- (空)setOrigin:(的Xypoint *)PT {

 if (!origin) 
     origin = [[XYPoint alloc]init]; 

     origin = pt; 
} 

NSLogged输出变成这样:

2014-01-23 15:29:54.287 Rectangle1[4398:303] square1 origin is 25 and 25 
2014-01-23 15:29:54.288 Rectangle1[4398:303] square1 origin is 125 and 125 
2014-01-23 15:29:54.289 Rectangle1[4398:303] square1 origin is 25 and 25 

什么这两者之间的区别是什么?这两个具有相同的特征指向x和y的相同坐标吗?

回答

0

因为你使用创建一个名为myPoint原点如下:

[myPoint setX:33 andY:33]; 

然后你正在做的myPoint正方形1使用来源:

[square1 setOrigin:myPoint]; 

而且那么你可以用下面的语句改变平方的坐标:

[myPoint setX:25 andY:25]; 
[myPoint setX:125 andY:125]; 
[myPoint setX:25 andY:25]; 

当您更改值,然后尝试使用打印原点

[[square1 origin]x]; 
[[square1 origin]y]; 

你会得到修改后的值,因为当你说:

[origin x]; // it points to myPoint.x which u r changing all the time. 

[origin Y]; // it points to myPoint.y which u r changing all the time. 

最后你得到正确的输出。请妥善分析代码。

编辑:您已经定义了问题:

-(void) setOrigin:(XYPoint *)pt; 

,当你这样做:

-(void) setOrigin:(XYPoint *)pt{ 
    if (!origin){ 
      origin = [[XYPoint alloc]init]; 

      origin = pt;// makes origin.X to point to pt.x and origin.Y to point to pt.y 
    } 
} 

你要做的仅仅是起源PT(这是myPoint),即原点不过是指向pt的指针,所以当myPoint的X和Y值发生变化时。您的origin.x和origin.y更改。 这是一个浅拷贝

但是,当我们做到这一点:

-(void) setOrigin:(XYPoint *)pt{ 
if (!origin){ 
origin = [[XYPoint alloc]init]; 
origin.x = pt.x;// copies value in pt.x to origin.x, so when pt.x changes origin.x doesn't change 
origin.y = pt.y;// copies value in pt.y to origin.y, so when pt.y changes origin.y doesn't change 
} 

    } 

我们acheiving一个深复制,这意味着每当mypoint.x和mypoint.y改变了我们的origin.x和origin.y没有变化。

+0

哦,我现在看到了,所以origin = pt和origin.x = pt.x之间存在巨大差异。虽然origin = pt用于指向地址值,并且origin.x = pt.x用于将pt.x值存储到origin.x中,但是目的是什么! (否定)如果(!起源)呢?是否只有一次功能,检查原点是否存在? – user3213703

+0

是的。当你说'origin = pt; ** pt的**地址**(即myPoint)**被分配给Origin。当你说'origin.x = pt.x'时,这里分配的值不是地址。 – iamyogish

+0

我也研究过斯蒂芬的书。如果你走得更远,他已经用整洁的图表解释了这一点。 – iamyogish