为什么我不能直接分配变量值?

时间:2010-08-18 23:54:38

标签: iphone objective-c xcode

我是新目标C.我试图从目标c 2.0中的Stephen Kochan编程中理解和解决问题。这个问题来自第8章。

我不明白的是:为什么我无法在获得变量值时直接分配变量值。

例如:

这不会给我一个错误或警告。但它也没有设定X和Y的值。

go.origin.x = 300;
go.origin.y = 100;

但是,这很好用,并给我预期的结果:

NSLog (@"print %i, %i", go.origin.x, go.origin.y);

这是我的XYPoint.h

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject {

    int _x;
    int _y;

}
@property int x;
@property int y;

@end

XYPoint.m

#import "XYPoint.h"

@implementation XYPoint

@synthesize x = _x;
@synthesize y = _y;
@end

GraphicObject.h

#import <Foundation/Foundation.h>
#import "XYPoint.h"

@interface GraphicObject : NSObject {

    XYPoint *_origin;
}

@property (nonatomic, retain) XYPoint *origin;

-(void) setOrigin : (XYPoint *) pt;

@end

GraphicObject.m

#import "GraphicObject.h"

@implementation GraphicObject

@synthesize origin = _origin;

-(void) setOrigin : (XYPoint *) pt {

    _origin = [[XYPoint alloc] init];

    _origin = pt;

    //_origin.x = pt.x;
    //_origin.y = pt.y;

}

@end

另外如果我不想在更改xypoint x和y时更改origin.x和origin.y,为什么我必须这样做:

_origin.x = pt.x;
_origin.y = pt.y;

为什么不呢:

_origin = pt;

例如,在文件中:

XYPoint *myPoint = [[XYPoint alloc] init];
go.origin = myPoint;

myPoint.x = 250;
myPoint.y = 50;

NSLog(@"Origin values %i, %i", go.origin.x, go.origin.y);

myPoint.x = 100;
myPoint.y = 10;

NSLog(@"Origin values %i, %i", go.origin.x, go.origin.y);

我知道原点的价值不会改变。但是,我必须在setOrigin:方法中以这种方式分配它:

_origin.x = pt.x 

而不是这样:

_origin = pt;

谢谢大家。我知道这是一个很长的问题。我真的很想了解并且也在许多地方看过,但我甚至不知道该搜索什么。你怎么称呼这种作业?

2 个答案:

答案 0 :(得分:3)

恭喜!您已经发现Objective-C属性是围绕getter方法和setter方法的语法糖。因为属性不是对象的真实对象(因为xyCGPoint结构的字段),所以修改对象属性的字段什么都不做 - 代码已解析表示“获取属性的值,然后修改该值的结果副本。”

现在,您可以属性获取和设置(例如anObject.widget.gear.speed *= 2),您可以字段获取和设置(例如myStructure.owner.uniqueID = rand())而且,正如你所看到的,它们看起来非常相似。但是你不能混合搭配它们。

为什么?

嗯,因为......你做不到。这就是它。因此,在将来,如果您遇到这些问题,请检查您是否正在混合和匹配属性和字段。如果是这样,你将不得不将它分开:

CGPoint pt = go.origin;
pt.x += 300;
pt.y -= 100;
go.origin = pt;

答案 1 :(得分:0)

@property int x;
@property int y;

......应该......

@property (nonatomic, readwrite) int x;
@property (nonatomic, readwrite) int y;