Possible Duplicate:
Is there any reason to declare ivars if you're using properties exclusively in Objective-C?
ObjectiveC ivars or @property
我是 iPhone 编程(以及整个编程场景)的新手。我尝试在各个地方研究属性,发现它们基本上是为其他类创建 getter 和 setter 方法以访问这些对象的捷径。
现在,我看到程序员在 @interface:UIViewController 之后的大括号中定义对象,并在之后的属性中定义对象,所有访问都将在该类的 .m 文件中进行。
现在,那段多余的(?)代码有必要吗?这是一个标准吗?期待一些通俗易懂的意见。
提前谢谢你。
我可以用多种方式解释你的问题:
问题:为什么有些程序员使用属性和实例变量(花括号内定义的变量),而其他人只使用属性,而其他人只使用实例变量?
回答:如您所知,@property
声明将在您@synthesize
时为您生成 getter 和 setter。从历史上看,这就是它为您所做的一切,您还必须手动声明您的实例变量。后来,编译器得到改进,如果您没有定义实例变量,@synthesize
语句也会生成它。首次引入时,通常的做法是同时定义属性和实例变量,但 Apple 最终改变了他们的指导方针并鼓励程序员不定义实例变量,而是让编译器从@property
和 @synthesize
声明。
因此,在回答您的问题时: 1. 为您的属性定义实例变量现在是多余的; 2.不再需要; 3. 现在不显式声明实例变量是标准的,而是让 @synthesize
语句来声明。
顺便说一句,@synthesize
语句的约定是,使用名为 var
的属性,在实例变量名称之前加上下划线,因此 @synthesize var = _var
。这样做是为了最大限度地减少程序员可能在预期属性时意外引用 ivar 的可能性(反之亦然)。为了进一步说明这是首选标准,从 Xcode 4.4 开始,甚至 @synthesize
语句也是可选的(因此,定义 @property
,但没有 ivar,也没有@synthesize
) 并且它会声明和定义与您的属性相同的名称,但前导下划线除外。
问题:为什么有些程序员会在.m文件中定义他们的一些属性和实例变量?为什么其他程序员只在类自己的 .m 文件中使用时在 .h 文件中声明他们的一些实例变量和属性。
回答:那些在 .m 文件中定义的实例变量和属性(在所谓的 class extension 中)只是定义那些没有公布给世界。在此约定中,您的 .h 文件只是您的公共(public)接口(interface)(哪些属性和方法可以从其他地方调用),其他所有内容都放在 .m 文件中。这是让您的界面更简洁的好方法,这样当您在将来某个日期使用您的类时,您可以只查看 .h 文件,而不会在类的实现细节中过于迷失。
过去,在类扩展变得流行之前,我们在 .h 文件中定义了所有实例变量和属性,即使它们是私有(private)的并且仅在类自己的 .m 文件中使用。因此,您仍然会看到一些执行此操作的代码。
因此,在回答您的问题时,1. 使用类扩展并不是多余的(除非您的类扩展是空的,但即使那样我也倾向于保留它以便我可以看到没有私有(private) ivars/属性); 2. 不需要使用类扩展;但是 3. 对仅在类本身中使用的私有(private)属性/变量使用类扩展是一种新兴标准,可能确实代表了最佳实践。