初学者Objective-C,对内存和指针的引用

初学者Objective-C,对内存和指针的引用,objective-c,object,memory,reference,Objective C,Object,Memory,Reference,这是我正在学习的一本书中的一个练习。我的练习做得很好,大部分我都理解,除了,我不知道我是否完全遗漏了什么,但是。。。 编译器究竟如何知道: x=168.354和y=987.259属于(XYPoint)pt* 那 x=10.00和y=10.00属于(XYPoint)t* 我知道myPoint和myTranslate在XYPoint类和诸如此类的对象中是如何分开的,它们指向存储X和Y的内存引用,但它如何将上述值分配给pt和t。我是不是错过了什么重要的东西 提前谢谢 代码如下: 接口 #import

这是我正在学习的一本书中的一个练习。我的练习做得很好,大部分我都理解,除了,我不知道我是否完全遗漏了什么,但是。。。 编译器究竟如何知道:

x=168.354和y=987.259属于(XYPoint)pt*

x=10.00和y=10.00属于(XYPoint)t*

我知道myPoint和myTranslate在XYPoint类和诸如此类的对象中是如何分开的,它们指向存储X和Y的内存引用,但它如何将上述值分配给pt和t。我是不是错过了什么重要的东西

提前谢谢

代码如下:

接口

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

@interface Rectangle : NSObject

@property float width, height;

-(XYPoint*) origin;

-(void) translate: (XYPoint *)t;

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

-(float) area;

-(float) perimiter;

-(void) setHeight:(float) h andWidth: (float) w;



@end
Implementation

#import "Rectangle.h"
#import "XYPoint.h"

@implementation Rectangle
{
    XYPoint *origin ;
}

@synthesize height, width;

-(void) setHeight: (float) h andWidth: (float) w;
{
    width = w;
    height = h;
}

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


-(void) translate: (XYPoint*)t
{
    origin.x = origin.x + t.x;
    origin.y = origin.y + t.y;
    
    
}

-(float) area
{

    return width * height;
    
}

-(float) perimiter
{
    return (width + height) * 2;
}


-(XYPoint *) origin
{
    return origin;
}


@end
#导入“XYPoint.h”
#进口
@接口矩形:NSObject
@属性浮动宽度、高度;
-(XYPoint*)原点;
-(空)翻译:(XYPoint*)t;
-(无效)设定原点:(XYPoint*)pt;
-(浮动)面积;
-(浮)橄榄石;
-(空)设置高度:(浮动)h和宽度:(浮动)w;
@结束
实施
#导入“Rectangle.h”
#导入“XYPoint.h”
@实现矩形
{
XYPoint*原点;
}
@综合高度、宽度;
-(空)设置高度:(浮动)h和宽度:(浮动)w;
{
宽度=w;
高度=h;
}
-(无效)设置原点:(XYPoint*)点
{
如果(!原点)
原点=[[XYPoint alloc]init];
原点x=pt.x;
原点y=点y;
}
-(空)平移:(XYPoint*)t
{
原点.x=原点.x+t.x;
origin.y=origin.y+t.y;
}
-(浮动)面积
{
返回宽度*高度;
}
-(漂浮)橄榄石
{
返回(宽度+高度)*2;
}
-(XYPoint*)原点
{
返回原点;
}
@结束
主要

#导入“XYPoint.h”
#导入“rectangle.h”
#导入“Square.h”
#进口
int main(int argc,const char*argv[]
{
@自动释放池{
矩形*myRect=[[Rectangle alloc]init];
XYPoint*myPoint=[[XYPoint alloc]init];
XYPoint*myTranslate=[[XYPoint alloc]init];
[myPoint setX:168.354 andY:987.259];
[MySetx:10.00 andY:10.00];
myRect.origin=myPoint;
NSLog(@“原点在%f,%f”,myRect.Origin.x,myRect.Origin.y);
[myRect翻译:myTranslate];
NSLog(@“原点在%f,%f”,myRect.Origin.x,myRect.Origin.y);
}
返回0;
}
输出:

起点:168.354004987.258972
翻译成178.354004、997.258972

t
pt
,它们是函数
setOrigin:
translate:
的参数

它们是在函数中赋值的变量,而不是反过来赋值的变量。它们用于更新原点
XYPoint

您似乎没有映射到此代码的函数(我可以看到)

因此,我不确定该函数是否会调用
setOrigin:
translate:
,但这会“赋值”
t
pt
(因为它们是函数的参数)

或者不管怎样,您可以设置
pt
,例如只需调用

[myPoint setOrigin:someOtherXYPointObject]; // someOtherXYPointObject here IS pt in this case

不确定这是否回答了你的问题

我忘了我有一个文件,里面有这个代码-(void)setX:(float)xVal安迪:(float)yVal{x=xVal;y=yVal;}是的,那些与此无关。很抱歉,我错过了您代码中的行
myRect.origin=myPoint这将自动为您调用
setOrigin:
。分配原始变量时,它将调用其setter方法。所以
myRect.origin=myPoint
[myRect setOrigin:myPoint]
实际上是一回事(在本例中,myPoint是
pt
)。下面的翻译也证明了这一点,谢谢。我想我开始理解得更好了。
[myPoint setX: 168.354 andY: 987.259];
[myPoint setOrigin:someOtherXYPointObject]; // someOtherXYPointObject here IS pt in this case