iphone - iPhone 编程中属性的使用

标签 iphone objective-c ios ios5 uiviewcontroller

<分区>

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)属性/变量使用类扩展是一种新兴标准,可能确实代表了最佳实践。

关于iphone - iPhone 编程中属性的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11818241/

相关文章:

iOS 8 - 无法安装企业应用程序

iphone - 为什么我的 UIImageView 不响应点击?

ios - 我正在尝试使用此代码每 5 秒触发一次本地通知

objective-c - NSToolbar 中的 NSPopUpButton 太烦人了

iPhone 可达性检查

iphone - 每台服务器的最大连接数

java - 如何更改由 J2Objc 生成的文件

iphone - 在iPhone中监听TCP端口

ios - 如果iOS更新中断了我的应用程序,该如何应对?

iphone - 在 Xcode 4.2 中使用 GPX 路线或轨道进行测试