【发布时间】:2010-11-08 22:58:44
【问题描述】:
Objective-C 中的属性和实例变量有什么区别。我需要用 OOP 术语来理解这一点。属性声明是否只是用于访问实例变量的便利包装器(在实现中使用 @synthesize)?
谢谢,
codecowboy。
【问题讨论】:
标签: iphone objective-c properties
Objective-C 中的属性和实例变量有什么区别。我需要用 OOP 术语来理解这一点。属性声明是否只是用于访问实例变量的便利包装器(在实现中使用 @synthesize)?
谢谢,
codecowboy。
【问题讨论】:
标签: iphone objective-c properties
Property和Instance ivar的区别在于,可以在另一个类中可见的属性,而要访问 iVar 或实例,您需要创建该类的对象,然后才能访问。 并且使用 @synthesize 编译器将为该属性生成 setter 和 getter。
-(TYPE)name;-getter 方法
-(void)setName:(TYPE)aName;设置方法
【讨论】:
properties 和 ivars 是两个完全不同的东西。
而实例变量是存储在对象内部的变量,所以每个实例都有自己的。它通过相对于对象指针/自身的指针添加来引用(对于现代运行时略微间接,但在功能上等效)。 ivars 通常在类内部,默认情况下只能由类及其后代 (@protected) 访问。在方法中,它们可以不加限制地使用,否则它们可以(但很少,通常不应该)通过间接访问,例如 obj->ivar。
一个属性定义了一个getter和setter(setter是可选的)接口。这就是它所做的一切。它定义了两个公共方法:
- (TYPE) propname;
- (void) setPropname: (TYPE) newPropname;
这些被定义为方法,就好像你这样声明它们,不多也不少。这些方法要么使用普通语法([obj propname] 和 [obj setPropname:n] 要么使用现代点符号(obj.propname 或 obj.propname = n)调用。这两个选项仅在语法上不同,它们的行为相同,并且无论方法是使用@property 声明还是如上所述手动声明,您都可以使用点符号。
然后你必须在实现中实现方法,要么自己编写方法,要么使用@synthesize,要么动态处理缺失的方法。
属性可能由 ivar 支持(命名相同或命名不同(我倾向于避免混淆)),也可能不支持。他们可能将其价值存储在其他地方,或者他们可能从其他数据中计算出来。
例如,您可能有:
@property (nonatomic, readonly) NSString* fullname;
然后实现 - (NSString*) fullname 以返回名和姓的串联。
【讨论】:
我认为你几乎在那里。 @property 和 @synthesize 为已声明的 ivar 进行访问器声明和实现。您还可以在 @property 上定义各种属性,让您可以控制它的生成方式以使其适合 ivar
【讨论】: