2

我正在尝试一些东西,因为我正在学习@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必须在接口文件中声明?

4

2 回答 2

2

我认为@property 创建了实例变量,@synthesize 为它创建了getter 和setter 方法。

这并不完全正确。该@property声明基本上只是对其他类做出承诺:“您可以要求我提供一个int命名x的 ,我也会回应尝试给我一个int以该名称存储的尝试。” 声明本身不会在类中创建任何东西,无论是方法还是 ivar。

就是@synthesize这样做。您可以自己实现自己的 setter、getter 和 ivar,也可以合成它们(或任何组合)。

因此,当您不使用时出现该错误的原因@synthesize是没有创建任何 ivars,因此x也不y是您可以在类中使用的名称。

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

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

x是参数的名称,您只是将其分配给它自己。(您不能在同一范围内拥有两个具有相同名称的变量。如果您创建了一个名为 的 ivar x则会收到有关方法参数隐藏 ivar 的编译器警告。这意味着参数名称相同作为 ivar,不允许您访问 ivar。)

如果您将其更改为:

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

您会看到关于x未声明的相同错误。

另外,为什么没有-(void) setY:(int)y并且-(void) setX:(int)x必须在接口文件中声明?

它们由@property指令声明。

于 2012-05-26T20:33:25.307 回答
0

在我看来,好像您只是将参数变量分配给它们已有的值。如果您更改参数名称,发生的事情可能更有意义:

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

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

错误消息应该是一致的。

于 2012-05-26T20:32:25.383 回答