我只是从我读过的一本书(Big Nerd Ranch)学习OOP,它刚刚经历了吸气剂和制定者章节。我想澄清一点,我明白我刚刚做了什么。我创建了使用@property
和@synthesize
语法来定义两种方法,而不是创建一个设置实例值的方法,然后另一种方法来提取值并显示它。
而不是这样做:
-(void) setHeightOfObject:(int)h;
-(void) setWeightOfObject:(float)w;
-(int) heightOfObject;
-(float) weightOfObject;
并像这样定义:
- (int)heightOfObject
{
return heightOfObject;
}
- (void)setHeightOfObject:(int)h
{
heightInMeters = h;
}
- (float)weightOfObject
{
return weightOfObject;
}
- (void)setWeightOfObject:(float)w
{
weightOfObject = w;
}
我会在.h文件中使用getter和setter来执行此操作:
@property int heightOfObject;
@property float weightOfObject;
然后转到我的.m文件并链接它:
@synthesize heightInMeters, weightOfObject;
这使我能够设置我的对象的值,然后在需要打印时获取它?我知道这是一个重要的概念,我想确保我对它有适当的把握。
答案 0 :(得分:3)
你是对的。 @synthesize
必要扩展到编译时编写的实现。
由于编写getter和setter是无聊且重复的(并且大多数对象都有一堆属性,你需要getter和setter),这个小小的快捷方式使你在boilerplate code上花费的时间更少,而且实现更多的时间有趣。
如果您想了解有关objective-c属性的更多详细信息,可以查看programming guide(尽管此时可能会对您进行详细介绍)。
答案 1 :(得分:1)
使用@property和@synthesize实现了两个部分。
@property告诉编译器它应该允许你使用点语法来调用heightOfObject和weightOfObject的访问器。所以这样做
int height = myObject.heightOfObject;
myObject.weightOfObject = 10;
成为合法代码,与此完全相同:
int height = [myObject heightOfObject];
[myObject setWeightOfObject:10];
您可以在不使用@synthesize的情况下使用@property,在这种情况下,您必须完全按照问题中的方式实现访问者。
使用@synthesize告诉编译器它应该为你生成访问器,如果你的运行时支持它,它也将自己生成实例变量(例如在iOS和64位OS X上)。
答案 2 :(得分:0)
答案 3 :(得分:0)
你不仅得到了吸气剂和二传手。您还可以获得一个简洁的语法:self.heightOfObject,您可以分配或读取它。 @property有很多设置,所以你可能想详细阅读。特别是,您可以控制是否需要读取和写入访问权限,或者只需要其中一个。