3

可能重复:
如果您仅在 Objective-C 中使用属性,是否有任何理由声明 ivars?
ObjectiveC ivars 或 @property

我是 iPhone 编程的新手(以及整个编程场景)。我尝试在各个地方研究属性,发现它们基本上是为其他类创建 getter 和 setter 方法以访问这些对象的快捷方式。

现在,我已经看到程序员在 @interface:UIViewController 之后的花括号中以及之后的属性中定义对象,此时所有访问都将发生在该类的 .m 文件中。

现在,那段多余的(?)代码,有必要吗?这是一个标准吗?期待一些通俗易懂的意见。

先感谢您。

4

1 回答 1

10

我可以通过多种方式解释您的问题:

问题:为什么有的程序员使用属性和实例变量(花括号内定义的变量),而有的只使用属性,有的只使用实例变量?

答:如您所知,@property声明将为您@synthesize生成 getter 和 setter。从历史上看,这就是它为您所做的一切,您还必须手动声明实例变量。后来,编译器得到了改进,如果你没有定义实例变量,@synthesize语句也会生成它。首次引入时,通常的做法是同时定义属性和实例变量,但 Apple 最终改变了他们的指导方针并鼓励程序员不要定义实例变量,而是让编译器自己从@propertyand@synthesize声明中生成它。

因此,回答您的问题: 1. 为您的属性定义实例变量现在是多余的;2. 不再需要;3. 现在的标准是不显式声明实例变量,而是让@synthesize语句来做。

顺便说一句,该@synthesize语句的约定是使用一个名为 的属性var,在实例变量名称之前加上一个下划线,因此@synthesize var = _var. 这样做是为了最大限度地减少程序员在预期属性时意外引用 ivar 的可能性(反之亦然)。为了进一步说明这是首选标准,从 Xcode 4.4 开始,即使@synthesize语句是可选的(因此,定义@property,但没有 ivar 和 no @synthesize)并且它将声明和 ivar 与您的属性相同的名称,除了前导下划线。

问题:为什么有些程序员会在.m 文件中定义他们的一些属性和实例变量?为什么其他程序员只在类自己的 .m 文件中使用它们的一些实例变量和属性在 .h 文件中声明。

回答:在 .m 文件中定义的那些实例变量和属性(在所谓的类扩展中)只是定义那些未向世界公布的 ivars/属性的便捷方式。在此约定中,您的 .h 文件只是您的公共接口(可以从其他地方调用哪些属性和方法),其他所有内容都放在 .m 文件中。这是一个让你的接口更简洁的好方法,所以当你在将来的某个日期使用你的类时,你可以只查看 .h 文件,而不会迷失在类的实现细节的细节中。

过去,在类扩展流行之前,我们在 .h 文件中定义了所有实例变量和属性,即使它们是私有的并且仅在类自己的 .m 文件中使用。因此,您仍然会看到一些执行此操作的代码。

所以,在回答你的问题时,1.使用类扩展并不是多余的(除非你的类扩展是空的,但即使那样我也倾向于保留它,这样我就可以看到没有私有的 ivars/属性);2. 不需要使用类扩展;但是 3. 对仅在类本身中使用的私有属性/变量使用类扩展是一种新兴标准,并且可能确实代表了最佳实践。

于 2012-08-05T16:57:34.233 回答