簡體   English   中英

為什么不能直接分配變量值?

[英]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方法的語法糖 因為屬性不是真正的對象字段(因為xyCGPoint結構的字段),所以修改對象屬性的字段不會執行任何操作-代碼解析為意味着“獲取屬性的值,然后修改該值的最終副本。”

現在,您可以鏈接屬性獲取和設置(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM