[英]Why can't I assign variable value directly?
我是新的ObjectiveC。我正在嘗試理解和練習Stephen Kochan在Objective C 2.0中的編程問題。 這個問題來自第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;
感謝大家。 我知道這是一個很長的問題。 我真的很努力地去理解,也去過很多地方,但是我什至不知道要搜索什么。 您怎么稱這種任務?
恭喜! 您已經發現,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;
@property int x;
@property int y;
...應該...
@property (nonatomic, readwrite) int x;
@property (nonatomic, readwrite) int y;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.