iPhone开发中的Objective-C属性

cod*_*boy 8 iphone properties objective-c

什么是Objective-C中的属性和实例变量之间的区别.我需要在OOP术语中理解这一点.属性声明只是一个方便的包装器(在实现中使用@synthesize)来访问实例变量吗?

谢谢,

codecowboy.

Pet*_*wis 7

属性和ivars是两个完全不同的东西.

而实例变量是存储在对象中的变量,因此每个实例都有自己的变量.它通过相对于对象指针/ self的指针添加来引用(对于现代运行时略有间接,但在功能上等效).ivars通常是类的内部,默认情况下只能由类及其后代(@protected)访问.在方法中,它们没有资格可用,否则它们可以(但很少,通常不应该)通过间接访问,例如obj-> ivar.

属性定义了getter和setter(setter是可选的)接口.就是这样.它定义了两个公共方法:

- (TYPE) propname;
- (void) setPropname: (TYPE) newPropname;
Run Code Online (Sandbox Code Playgroud)

这些被定义为方法,就像你声明它们一样,不多也不少.这些方法使用普通语法([obj propname]和[obj setPropname:n]或使用现代点表示法(obj.propname或obj.propname = n)调用.这两个选项在语法上不同,它们的行为相同,您可以使用点表示法,无论方法是使用@property声明还是手动声明,如上所述.

然后,您必须通过自己编写方法,使用@synthesize或动态处理缺少的方法来实现实现中的方法.

属性可以由ivar支持(命名相同或命名不同(我的偏好以避免混淆)),或者它们可能不支持.他们可能将其值存储在其他地方,或者他们可能从其他数据中计算出来.

例如,您可能有:

@property (nonatomic, readonly) NSString* fullname;
Run Code Online (Sandbox Code Playgroud)

然后实现 - (NSString*)fullname以返回firstname和lastname的串联.

  • 属性是外部对象获取和设置数据的接口.实例变量是该对象的内部变量,尽管它可以使用属性,自己的getter/setter方法或通过您创建的其他公共方法间接地暴露给外部对象. (2认同)