在我了解@property
和@synthesize
时,我正在尝试一些事情。我认为@property
创建了实例变量,@synthesize
为它创建了getter和setter方法。
#import <Foundation/Foundation.h>
@interface XYPoint : NSObject
@property int x, y;
-(void) setX: (int) xVar andY: (int) yVar;
@end
我没有在我的实现文件中合成x
和y
,但我想知道为什么我被允许同时执行这两项操作:
-(void) setX:(int)x {
x = x;
}
-(void) setY:(int)y {
y = y;
}
但是当我这样做时收到有关未声明标识符x
和y
的错误消息:
-(void) setX:(int)xVar andY:(int)yVar {
x = xVar;
y = yVar;
}
另外,为什么不必在接口文件中声明-(void) setY:(int)y
和-(void) setX:(int)x
?
答案 0 :(得分:2)
我认为@property创建了实例变量,而@synthesize为它创建了getters和setters方法。
这不太正确。 @property
声明基本上只是对其他课程做出承诺:“您可以向我询问int
名为x
的人,我也会回复尝试给我int
以该名称存储。“声明本身不会在类中创建任何方法或者ivar。
这两件事<{1}} 您可以自己实现自己的setter,getter和ivar,也可以合成它们(或任何组合)。
因此,当您不使用@synthesize
时收到该错误的原因是没有创建ivars,因此@synthesize
和x
不是您可以使用的名称在课堂内使用。
在第一种情况下,你没有做你认为自己在做的事情。在这种方法中:
y
-(void) setX:(int)x {
x = x;
}
是参数的名称,您只需将其分配给自己。 (在同一范围内,您不能有两个具有相同名称的变量。如果您已经创建了一个名为x
的ivar,您将收到一个关于方法参数的编译器警告ivar。这意味着参数名称与ivar相同,不允许您访问ivar。)
如果您将其更改为:
x
您会看到有关-(void) setX:(int)newX {
x = newX;
}
未声明的相同错误。
另外,为什么不必在接口文件中声明
x
和-(void) setY:(int)y
?
它们由-(void) setX:(int)x
指令声明。
答案 1 :(得分:0)
在我看来,好像你只是为参数变量分配它们已有的值。如果更改参数名称,正在发生的事情会更有意义:
-(void) setX:(int)xVar {
x = xVar;
}
-(void) setY:(int)yVar {
y = yVar;
}
错误消息应该是一致的。