我什么时候应该在标题中声明一个实例变量而不是属性?

时间:2014-06-06 16:32:08

标签: objective-c ivar declared-property

例如,在以下代码中。

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

@interface TUTViewController : UIViewController

@property (weak, nonatomic) NSTimer *timer;

@end

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

2 个答案:

答案 0 :(得分:2)

你会对此有很多意见,通常被称为快速规则。

示例:

  

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

我非常尊重Maddy,但我对此不以为然。

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

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

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

我所做的就是让一切都变成iVar,除非:

  1. 我需要一个具有特殊行为的自定义getter或setter方法。
  2. 我想从另一个对象访问该值。
  3. 我需要将一个属性标记为" atomic"从另一个线程访问。 (养成将所有属性声明为"非原子的习惯。"如果你不知道原子的用途,你需要非原子。原子属性比非原子属性慢。)
  4. 作为政策问题,我从不访问另一个对象的iVars,除了通过属性。

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

答案 1 :(得分:0)

我强烈建议使用@properties,除非有充分的理由不这样做。确实,讨论是宗教性的而不是技术性的,但由于我们可能都是Cult of 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

这些并非对您班级的其他消费者完全私密,但一见钟情就隐藏了。这应告诉其他开发者他或她不应该使用它们。我认为公共/私有更多地与文档有关,因为它与大多数应用程序的应用程序安全性有关。