我有一个程序,我很乐意帮助完全理解。
XYPoint.h:
#import <Foundation/Foundation.h>
@interface XYPoint : NSObject
@property float x, y;
-(void) setX: (float)xVal setY: (float)yVal;
@end
XYPoint.m:
#import "XYPoint.h"
@implementation XYPoint
@synthesize x, y;
-(void) setX:(float)xVal setY:(float)yVal
{
x = xVal;
y = yVal;
}
@end
Rectangle.h:
#import <Foundation/Foundation.h>
@class XYPoint;
@interface Rectangle: NSObject
@property float width, height, tx, ty;
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) translate: (XYPoint *) point;
@end
Rectangle.m:
#import "Rectangle.h"
#import "XYPoint.h"
@implementation Rectangle
{
XYPoint *origin;
}
@synthesize width, height, tx, ty;
-(void) setWidth: (float) w andHeight: (float) h
{
width = w;
height = h;
}
-(void) translate:(XYPoint *)point
{
tx = origin.x + point.x;
ty = origin.y + point.y;
}
-(void)setOrigin:(XYPoint *)pt
{
//if (!origin)
// origin = [[XYPoint alloc] init];
origin.x = pt.x;
origin.y = pt.y;
}
-(XYPoint *) origin
{
return origin;
}
@end
主:
#import <Foundation/Foundation.h>
#import "XYPoint.h"
#import "Rectangle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Rectangle *myRect = [[Rectangle alloc] init];
XYPoint *vector = [[XYPoint alloc] init];
XYPoint *origin = [[XYPoint alloc] init];
[origin setX:10 setY:15];
[myRect setOrigin:origin];
[vector setX:30 setY:50];
[myRect translate:vector];
NSLog(@"%f , %f", myRect.tx, myRect.ty);
}
return 0;
}
在Rectangle实现中有一个if (!origin)
来测试原始对象是否已初始化,如果没有,它将分配并初始化它。我不明白为什么当我使用这个测试时我得到了正确的答案,而当我没有,我没有得到正确答案.. \
有人可以解释一下新手会发生什么事吗?
tnx
答案 0 :(得分:3)
你在问题中回答了这个问题:
if(!origin)来测试是否初始化了原始对象,如果没有, 它会分配并初始化它
if (!origin)
适用于lazy initialization,如果您未对其进行初始化,则会保留nil
。 Objective-C允许您在没有任何结果的情况下向nil
发送消息,因此如果您从未初始化源origin.x = pt.x;
并且origin.y = pt.y;
什么都不做,那么依赖于origin的所有数学运算都将使用{{1 }}