Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么可以';我不能直接赋值吗?_Iphone_Objective C_Xcode - Fatal编程技术网

Iphone 为什么可以';我不能直接赋值吗?

Iphone 为什么可以';我不能直接赋值吗?,iphone,objective-c,xcode,Iphone,Objective C,Xcode,我是新的目标C。我正在努力理解和锻炼斯蒂芬·科陈在目标C 2.0中的编程问题。这个问题来自第八章 我不明白的是:当我可以得到变量值时,为什么我不能直接赋值呢 例如: 这不会给我一个错误或警告。但它也不设置X和Y的值 go.origin.x = 300; go.origin.y = 100; 但是,这很好,给了我预期的结果: NSLog (@"print %i, %i", go.origin.x, go.origin.y); 这是我的观点 #import <Foundation/Foun

我是新的目标C。我正在努力理解和锻炼斯蒂芬·科陈在目标C 2.0中的编程问题。这个问题来自第八章

我不明白的是:当我可以得到变量值时,为什么我不能直接赋值呢

例如:

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

go.origin.x = 300;
go.origin.y = 100;
但是,这很好,给了我预期的结果:

NSLog (@"print %i, %i", go.origin.x, go.origin.y);
这是我的观点

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject {

    int _x;
    int _y;

}
@property int x;
@property int y;

@end
图形对象.h

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

@interface GraphicObject : NSObject {

    XYPoint *_origin;
}

@property (nonatomic, retain) XYPoint *origin;

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

@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;
谢谢大家。我知道这是一个很长的问题。我真的试着去理解,也看了很多地方,但我甚至不知道该找什么。这种任务叫什么

@property int x;
@property int y;
…应该是

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

恭喜你!您已经发现Objective-C属性是围绕getter方法和setter方法的语法糖。因为属性不是对象的真正字段(因为
x
y
CGPoint
结构的字段),修改对象属性的字段没有任何作用——代码解析为“获取属性的值,然后修改该值的结果副本”

现在,您可以链接属性get和set(例如,
anObject.widget.gear.speed*=2
),也可以链接字段get和set(例如,
myStructure.owner.uniqueID=rand()
),正如您所见,它们看起来非常相同。但你不能混搭它们

为什么?

嗯,因为。。。你不能。差不多就是这样。因此,在将来,如果您遇到此类问题,请检查是否正在混合和匹配属性和字段。如果是这样,您必须将其拆分:

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

这是一个iPhone问题。你应该用
CGRect
替换
NSRect
,用
CGRectMake
替换
nsmakerct
是的,你说得对,我最近在桌面上工作太多了,以至于我忘了iPhone的微妙之处。但我也找到了OP出错的原因。我真的不应该马上回答这些问题。上面的陈述不起作用。另外,Jasarien,我对目标c还不熟悉,所以如果我错了,请纠正我,但我没有使用NSRect和NSMakeRect。你能再看看我的另一个问题吗。谢谢你把这件事弄清楚。在你解释之前,我很难理解这一点。也可以澄清我关于分配_origin.x=pt.x而不是_origin=pt的第二个疑问。再次感谢。您可以直接将一个结构的值分配给同一类型的另一个结构,因此如果它们是结构,则
\u origin=pt
将起作用。但是,由于您创建了一个模仿
CGPoint
结构的类,因此这样的赋值是按引用赋值,而不是按值赋值。所以你说“make
\u origin
引用与
pt
相同的对象”,但这使得
go
中的原始引用保持不变。是的,它确实起作用,但与上面的示例一样,当我更改myPoint.x或myPoint.y时,\u origin.x和_origin.y的值也会改变。但是当我声明_origin.x=pt.x和_origin.y=pt.y时。_origin的值即使在我更改myPoint时也不会更改。以下是内存泄漏,因为它替换了_origin的引用,而不是值:`_origin=[[XYPoint alloc]init]_原点=pt<代码>。随后,设置\u origin`字段将修改原始的
pt
,并且
\u origin.ANYTHING=pt。任何
都将成为不可操作项。因为您使用的名称与现有的Apple类型类似,而该类型不是对象,因此您的代码读起来有点混乱。你不使用CGPoint有什么原因吗?不使用CGPoint的原因是我正在阅读《在objective C 2.0中编程》这本书,但我还没有达到可以使用CGPoint的程度(我只是对CGPoint有一个模糊的概念)。这在第8章中,我认为CGPoint在第15章左右的章节中有介绍。说到内存泄漏,我确实通过在GraphicObject.m文件中声明dealloc来释放它。但我想我理解你的解释,当我读到相关章节时,我会记住这一点。再次感谢您抽出时间回答我的问题。
@property (nonatomic, readwrite) int x;
@property (nonatomic, readwrite) int y;
CGPoint pt = go.origin;
pt.x += 300;
pt.y -= 100;
go.origin = pt;