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