我是新目标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;
谢谢大家。我知道这是一个很长的问题。我真的很想了解并且也在许多地方看过,但我甚至不知道该搜索什么。你怎么称呼这种作业?
答案 0 :(得分:3)
恭喜!您已经发现Objective-C属性是围绕getter方法和setter方法的语法糖。因为属性不是对象的真实对象(因为x
和y
是CGPoint
结构的字段),所以修改对象属性的字段什么都不做 - 代码已解析表示“获取属性的值,然后修改该值的结果副本。”
现在,您可以链属性获取和设置(例如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;