在iPhone编程中使用属性

时间:2012-08-05 16:49:43

标签: iphone objective-c ios ios5 uiviewcontroller

  

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

现在,那段多余的(?)代码,是否有必要?这是标准吗?期待一些可理解的意见。

提前谢谢。

1 个答案:

答案 0 :(得分:10)

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

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

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

所以,回答你的问题:1。为你的房产定义实例变量现在是多余的; 2.不再需要;现在,标准是不显式声明实例变量,而是让@synthesize语句执行此操作。

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

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

答案: .m文件中定义的那些实例变量和属性(在所谓的class extension中)只是定义那些未公布的ivars / properties的便捷方式致全世界。在此约定中,您的.h文件只是您的公共接口(可以从其他地方调用哪些属性和方法),而其他所有内容都在.m文件中。这是一种很好的方法来保持你的界面更清洁,所以当你在将来的某个日期使用你的类时,你可以只看一下.h文件,而不要在类的实现细节的细节上迷失方向。

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

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