【问题标题】:Usage of Properties in iPhone Programming [duplicate]iPhone编程中属性的使用[重复]
【发布时间】:2012-08-02 19:57:17
【问题描述】:

可能重复:
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 文件中时。

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

提前谢谢你。

【问题讨论】:

标签: iphone objective-c ios ios5 uiviewcontroller


【解决方案1】:

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

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

答案: 如您所知,@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)并且它将声明和 ivar 相同名称作为您的属性,但前导下划线除外。

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

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

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

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

【讨论】:

  • 哇!这超出了我的要求。感谢如此清晰的回复。这对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多