0

完全に理解するために助けを求めたいプログラムがあります。

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

長方形.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

4

1 に答える 1

3

あなたはあなたの質問でそれに答えました:

if (!origin) オリジンオブジェクトが初期化されているかどうかをテストし、そうでない場合は割り当てて初期化します

遅延初期化if (!origin)用であり、初期化しないと残ります。Objective-C を使用すると、結果なしでメッセージを送信できます。したがって、originを初期化せずに何もしない場合、origin に依存するすべての数学演算は を使用します。nilnilorigin.x = pt.x;origin.y = pt.y;0.0

于 2013-02-13T20:20:31.693 に答える