使用@property和@synthesize创建访问器方法和ivars的详细信息

时间:2012-05-26 20:24:29

标签: objective-c properties

在我了解@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

我没有在我的实现文件中合成xy,但我想知道为什么我被允许同时执行这两项操作:

-(void) setX:(int)x {
    x = x;
}

-(void) setY:(int)y {
    y = y;
}

但是当我这样做时收到有关未声明标识符xy的错误消息:

-(void) setX:(int)xVar andY:(int)yVar {
    x = xVar;
    y = yVar;
}

另外,为什么不必在接口文件中声明-(void) setY:(int)y-(void) setX:(int)x

2 个答案:

答案 0 :(得分:2)

  

我认为@property创建了实例变量,而@synthesize为它创建了getters和setters方法。

这不太正确。 @property声明基本上只是对其他课程做出承诺:“您可以向我询问int名为x的人,我也会回复尝试给我int以该名称存储。“声明本身不会在类中创建任何方法或者ivar。

这两件事<{1}} 您可以自己实现自己的setter,getter和ivar,也可以合成它们(或任何组合)。

因此,当您不使用@synthesize时收到该错误的原因是没有创建ivars,因此@synthesizex不是您可以使用的名称在课堂内使用。

在第一种情况下,你没有做你认为自己在做的事情。在这种方法中:

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;
}

错误消息应该是一致的。