我正在尝试学习目标C,我正在通过一些简单的代码来解决它。以下是头文件的示例:
#import <Foundation/Foundation.h>
@class XYPoint;
@interface Rectangle: NSObject
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;
@end
任何人都可以解释“@property int width,height;”这一行的含义吗?谢谢!
答案 0 :(得分:3)
属性语法允许您以简短的语法声明getter和setter的组合。在您的代码中,声明创建了四种方法:
-(int) width;
-(void)setWidth:(int)val;
-(int) height;
-(void)setHeight:(int)val;
可能还有一个实现,它将这些方法与上面定义的名称为width
和height
的“支持变量”联系起来; .m文件中可能还有一个@synthesize
指令。
在当前版本的Objective-C中,不需要声明支持变量:默认情况下会合成所有属性,但如果您愿意,可以提供自己的实现。
属性支持在Objective-C中调用getter和setter方法的另一种方法:除了标准
int h = [point height];
[point setWidth:123];
你可以写
int h = point.height;
point.width = 123;
没有必要声明属性以使用点语法:您可以使用点语法调用任何不带参数的值返回方法或带有单个参数的setter方法。
答案 1 :(得分:1)
这是其他类引用{和}之间声明的私有iVars的一种方式。
基本上,它会创建一个getter和一个setter,对于像int这样的原始类型,它将如下所示:
- (int)width
{
return width;
}
- (void)setWidth:(int)width
{
_width = width;
}
如果你愿意,你可以覆盖这两种方法。
根据约定,底层实例变量应以“_”为前缀:
@interface Rectangle: NSObject
{
int _width;
int _height;
XYPoint *_origin;
}
如果您没有声明它们,编译器会为您执行此操作,但请注意,如果您同时覆盖getter和setter,则需要在“.m”文件中添加此类语句:
@synthesize width = _width;
因为在这种情况下编译器不会代表您生成“_width”ivar。