2014-06-06 18 views
0

例如,在下面的代码中。什么时候应该声明一个实例变量而不是头中的属性?

@interface TUTViewController : UIViewController 
{ 
    NSTimer *timer; 
} 
@end 

@interface TUTViewController : UIViewController 

@property (weak, nonatomic) NSTimer *timer; 

@end 

在这情况下我们使用第一种方法来声明变量?

+3

如果要控制获取/设置逻辑,则声明一个属性。与你拥有的伊娃相当的财产也不会太弱。 –

+1

永远不要把ivars放在.h中。 ivars应该永远是私人的意思,他们不属于公众.h。如果你创建ivars,把它们放在.m文件中。 – rmaddy

+0

我几乎从不说。对于objC类型,总是尝试使用属性。如果您需要从您的实施中使用伊娃,那么无论如何您都可以这样做。 例如,我看到了objC类型,因为我有使用C++引用作为属性的问题。 –

回答

2

你会在这方面得到很多意见,通常表示为硬性规定。

实施例:

麦迪:不要将实例变量在.H。 ivars应该永远是私人的 这意味着他们不属于公众.h。如果创建实例变量,把 他们在.m文件

我对麦迪非常尊敬,但我不同意他在这一个。

如果你把你的iVars放在你的.m文件中,它们对其他类是隐藏的,但它们也隐藏在你创建的子类中。

我更喜欢将我的实例变量标记为@protected,这使得它们可用于子类,但不能用于其他类。

其他人会告诉你做一切财产。在ARC之前,将所有对象保存在属性中是有意义的,因为您可以使用属性上的setter来管理对象上的内存。 (当赋值给一个保留属性时,setter将首先释放任何旧值,然后保留新值。)现在ARC即使对于iVars也为你处理,因此使所有属性成为属性的参数较少。

我做的是使一切伊娃,除非:

  1. 我需要一个自定义的getter和setter方法有特殊的行为。
  2. 我想访问另一个对象的值。
  3. 我需要将一个属性标记为“原子”,以便从另一个线程访问。 (习惯于将所有属性声明为“非原子”)如果你不知道原子是为了什么而需要非原子的,原子属性比非原子属性慢。)

作为政策我绝不会访问另一个对象的iVar除了通过属性。

在使用属性而不是实例变量时,存在一个小而实际的开销。读/写属性总是进行方法调用。一个iVar直接访问内存,而不需要方法调用的开销。通常情况下,差异太小而无关紧要。但是,如果您正在执行数百万次操作,例如对大图像中的每个像素执行操作,或者实时处理视频或音频采样的回调,则差异可能很大。

+1

子类不应该有权访问超类的ivars。它打破封装。有一个原因,我们无法在我们所有的Apple课程中访问ivars。事情不会中断。在你自己的课程中遵循相同的指导原则。受保护的ivars是一个糟糕的设计选择,使您的班级体系变得脆弱。 – rmaddy

0

我会强烈建议使用@properties,除非有很好的理由不要。诚然,讨论不仅仅是技术性的讨论,而且因为我们可能都是Mac邪教组织的追随者,如果Apple倾向于使用@properties,那么这就是标准。在我看来,Apple文档和Xcode都不像在ReSharper中那样在Visual Studio中执行标准(例如当你不使用var时警告)。这太遗憾了,因为这会让我更容易在别人之后拿起代码。

有一种方法可以在.m文件“隐藏” @properties,你应该声明如下:

@interface ABCMySpiffyClass() 

@property (weak, nonatomic) IBOutlet UIImageView *spiffyImage; 
@property (weak, nonatomic) IBOutlet UILabel *spiffyTitle; 

@end 

这些都不是完全私有类的另一种消费,但它是在隐藏第一眼。这应该告诉其他开发者他或她不应该使用它们。我认为公共/私人更多与文档有关,因为它与大多数应用程序的应用程序安全性有关。

相关问题