【发布时间】:2011-04-14 18:22:51
【问题描述】:
假设我有这样的课程:
@interface MyAwesomeClass : NSObject
{
@private
NSString *thing1;
NSString *thing2;
}
@property (retain) NSString *thing1;
@property (retain) NSString *thing2;
@end
@implementation MyAwesomeClass
@synthesize thing1, thing1;
@end
当访问thing1和thing2时内部(即在MyAwesomeClass的实现中),是使用属性更好,还是直接引用实例变量(假设情况其中我们不在“自定义”访问或修改器中做任何工作,即我们只是设置和获取变量)。 Pre-Objective C 2.0,我们通常只是直接访问 ivars,但现在通常的编码风格/最佳实践是什么?如果实例变量/属性是私有的并且在类之外根本无法访问,那么这个建议会改变吗?您应该为每个 ivar 创建一个属性,即使它们是私有的,还是仅用于面向公众的数据?如果我的应用不使用键值编码功能(因为 KVC 仅触发属性访问)怎么办?
我感兴趣的是超越底层技术细节。例如,给定(次优)代码,如:
@interface MyAwesomeClass : NSObject
{
id myObj;
}
@proprety id myObj;
@end
@implementation MyAwesomeClass
@synthesize myObj;
@end
我知道myObj = anotherObject 在功能上与self.myObj = anotherObj 相同。
当然,属性不仅仅是指示编译器为您编写访问器和修改器的花哨的语法;它们也是一种更好地封装数据的方法,即,您可以更改类的内部实现,而无需重写依赖这些属性的类。在处理类自己的 internal 代码时,我对解决此封装问题重要性的答案感兴趣。此外,正确编写的属性可以触发 KVC 通知,但直接 ivar 访问不会;如果我的应用现在不使用 KVC 功能,以防万一将来可能使用,这是否重要?
【问题讨论】:
标签: objective-c oop