通过返回值来更改对象?

时间:2015-02-14 20:25:13

标签: objective-c pointers

这是非常基本的,但是当我这样做时,我不明白为什么:

int main(int argc, const char * argv[]) {
@autoreleasepool {
    Rectangle *myRect = [[Rectangle alloc] init];
    XYPoint *myPoint = [[XYPoint alloc] init];

    [myPoint setX:100 andY:200];

    [myRect setWidth:5 andHeigth:8];
    myRect.origin = myPoint;

    NSLog(@"Origin at (%i, %i)", myRect.origin.x, myRect.origin.y);


    [myPoint setX:50 andY:50];
    NSLog(@"Origin at (%i, %i)", myRect.origin.x, myRect.origin.y);

    XYPoint *theOrigin = myRect.origin;

    theOrigin.x = 200;
    theOrigin.y = 300;

     NSLog(@"Origin at (%i, %i)", myRect.origin.x, myRect.origin.y);

}
return 0;
}

我的矩形的原点发生了变化。这是输出:

Origin at (100, 200)
Origin at (100, 200)
Origin at (200, 300)
Program ended with exit code: 0

但如果我做了类似的事情:

int a, b;
a = 5;
b = 6;
b = a;

a的值将保持为5,b将变为6。

我认为等号右侧的值永远不会改变,但是设置等号左侧的值。那么为什么我这样做:

XYPoint *theOrigin = myRect.origin;

    theOrigin.x = 200;
    theOrigin.y = 300;

为什么myRect.origin的值会发生变化? theOrigin是一个指针,为什么更改指针的值会改变它指向的对象(myRect)?我的书中说“回报价值很脆弱”。那是什么意思?如果我想在方法myRect.origin中复制,那么通过执行:

XYPoint *theOrigin = myRect.origin;

    theOrigin.x = 200;
    theOrigin.y = 300;

myRect.origin的值不会改变?

1 个答案:

答案 0 :(得分:0)

“myRect.origin的值会改变吗?”

是的,因为您正在修改同一个对象。 XYPoint *theOrigin是一个指向对象的指针,它指向与myRect.origin相同的对象(它也是一个指针。)我建议你阅读一些关于指针的内容,这将有助于你理解这种行为。 (别担心,指针本身很简单。)