【发布时间】:2014-10-31 17:54:59
【问题描述】:
我已经编写 Objective-C 几年了,并决定回去学习基础知识,以帮助我编写更好的代码。我正在尝试学习所有关于实例变量、继承和类扩展的知识。我一直在阅读这三个方面的内容,但有一件事让我大吃一惊。我有一个简单的应用程序,其中包含 2 个类,Person、Male(从 Person 继承),当然还有 Main(它导入 Male 类,因此能够访问 Person 和 Male 中的实例变量)。
代码很简单,为了篇幅我就不一一贴出来了。基本上 Main 采用这些变量并使用它们。这是让我难以置信的部分:
@interface Person : NSObject {
float heightInMeters;
int weightInKilos;
}
@property float heightInMeters;
@property int weightInKilos;
@end
当我删除括号和变量声明时,保留如下:
@interface Person : NSObject
@property float heightInMeters;
@property int weightInKilos;
@end
代码仍然继承和执行得很好。
1.如果我们可以只创建两个属性,那么一开始就在那里声明它们有什么意义?
2.为什么要创建两个实例变量和属性来对应它们?
3. 我知道我们可以在 .m 中声明变量,而不是让它们对类及其子类的所有内容都是私有的。像这样:
@implementation Person {
float heightInMeters;
int weightInKilos;
}
这里有什么区别?我觉得我错过了很多基础知识。有没有一种简单的方式来看待这一切?
【问题讨论】:
-
Xcode 4.4 中添加了“自动属性合成”,所以你的第二个版本很好,在大多数情况下你不必声明实例变量。参见例如stackoverflow.com/questions/9368676/…。
-
@MartinR 这很有趣......谢谢你的例子。并且在一些相关的混淆说明中...... heightInMeters 和 weightInKilos 都是实例变量而不是类变量,对吗?
-
是的。准确地说,如果您声明
@property float heightInMeters;,那么编译器将“合成”一个相应的实例变量_heightInMeters(带有下划线)。但是已经有很多围绕该主题的问答,如果您搜索“属性与实例变量”,您应该会找到所需的一切。 -
Objective-C 2.0 中还添加了非脆弱实例变量。这消除了在 @interface { } 块中声明所有内容的需要
标签: objective-c inheritance class-extensions