Objective-C 中属性和实例变量有什么区别?我需要用 OOP 术语来理解这一点。属性声明只是一个用于访问实例变量的便利包装器(在实现中使用@synthesize)吗?
thanks,
代码牛仔。
属性和 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 以返回名字和姓氏的串联。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)