Objective-C 中的属性和实例变量有什么区别。我需要用 OOP 术语来理解这一点。属性声明只是一个方便的包装器(在实现中使用@synthesize)来访问实例变量吗?
谢谢,
代码牛仔。
最佳答案
Properties 和ivars 是两个完全不同的东西。
而实例变量是存储在对象内部的变量,所以每个实例都有自己的。它通过相对于对象指针/自身的指针添加来引用(对于现代运行时来说略微间接,但在功能上是等效的)。 ivar 通常是类内部的,默认情况下只能由该类及其后代访问(@protected)。在方法中,它们无需限定即可使用,否则它们可以(但很少,通常不应该)通过间接访问,例如 obj->ivar。
一个属性定义了一个 getter 和 setter(setter 是可选的)接口(interface)。这就是它所做的一切。它定义了两个公共(public)方法:
- (TYPE) propname;
- (void) setPropname: (TYPE) newPropname;
这些被定义为方法,就像您那样声明它们一样,不多也不少。这些方法使用普通语法([obj propname] 和 [obj setPropname:n] 或使用现代点符号(obj.propname 或 obj.propname = n)调用。这两个选项仅在语法上不同,它们的行为相同, 并且无论方法是使用 @property 声明还是如上所述手动声明,您都可以使用点符号。
然后您必须在实现中实现这些方法,方法是自己编写方法、使用@synthesize 或动态处理缺少的方法。
属性可能由 ivar 支持(命名相同或不同(我的偏好是为了避免混淆)),也可能不支持。他们可能会将其值(value)存储在其他地方,或者他们可能会从其他数据中计算出来。
例如,您可能有:
@property (nonatomic, readonly) NSString* fullname;
然后实现 - (NSString*) fullname 以返回名字和姓氏的串联。
关于iphone - iPhone 开发中的 Objective-C 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096611/