如果我不检查对象是否在Objective C中初始化,会发生什么?

时间:2013-02-13 20:16:52

标签: objective-c

我有一个程序,我很乐意帮助完全理解。

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

1 个答案:

答案 0 :(得分:3)

你在问题​​中回答了这个问题:

  

if(!origin)来测试是否初始化了原始对象,如果没有,   它会分配并初始化它

if (!origin)适用于lazy initialization,如果您未对其进行初始化,则会保留nil。 Objective-C允许您在没有任何结果的情况下向nil发送消息,因此如果您从未初始化源origin.x = pt.x;并且origin.y = pt.y;什么都不做,那么依赖于origin的所有数学运算都将使用{{1 }}