在Objective-C中,何时应该使用属性,什么时候应该使用实例variables?

我不熟悉具有属性和实例variables的程序语言。
所以我不知道使用属性和实例variables的好方法。

现在我只在我的Objective-C代码中使用属性,并且不使用任何实例variables。

我是否需要使用实例variables?
或者只使用属性是Objective-C的最佳实践?

@interface ViewController : UIViewController { // instance variable @public int a; } // property @property(nonatomic, strong) NSString *b; @end 

随处使用属性。 甚至不要声明实例variables,而是像这样合成它们: @synthesize myProperty = _myProperty为了区别它们的属性名称。 属性也是处理内存pipe理的好方法。 唯一必须使用综合实例variables的地方是dealloc方法。
这些属性的优点是很多的:
– 访问器方法定义了如何获取和设置实例variables的值。
– 您可以自定义访问器方法(例如,懒惰实例化一个ivar或者在设置一个像setNeedsDisplay这样的新值时执行一些操作。
– 设置一个新值时,你无法应付内存pipe理 – setter负责释放/保留(取决于你如何声明属性 – retain / copy / assign / strong
– 一些multithreading的东西与atomic / nonatomic属性
– 使用属性时,您可以利用KVO
– 至less,但不是最后 – 不要担心性能问题,如果你有每一次调用getter或setter的时候,

variables和属性的基本区别在于,可以给属性赋予属性。 你不能给variables赋予任何属性。 所以,如果你希望有任何特定的行为,比如保留variables,以primefaces方式访问它,访问类,你应该去的属性。

如果你只想访问类中的variables,并且没有特别的行为附加到该variables,则不需要通过属性访问它。 你可以直接使用variables本身。 它也会改善性能。

@property对伊娃有一些优势:

  • 内存pipe理 :在幕后它将创build一个设置器,用正确的内存pipe理来创buildvariables。 它会为您节省一些麻烦,因为您可以轻松地看到内存pipe理是如何完成的( strong / weakretain / copy / assign )。

  • 来自其他类的可访问性 :如果您在.h中声明了@property ,并且在.m中声明了它,那么您的ivar将是公共可读和可写的。 你可以用privat类扩展来防止这种情况。 你甚至可以声明一个@property public readonly并通过privat类扩展名在内部声明它们。 例如:私人财产

  // [In the implementation file] @interface MyClass () @property (nonatomic, retain) NSMutableArray* someData; // private!! @end @implementation MyClass @synthesize someData @end 
  • 自定义getter和setter :如果你喜欢,你仍然可以写自定义的getter和setter,你甚至可以写一个getter或setter,让另一个自动@synthesize 。 你可以把自定义的逻辑写入这样一个getter和setter,例如你可以在@property改变后重新加载tableview。

  • 自动键值观察(KVO)兼容 :如果您使用或计划使用KVO,只要声明属性即可免费获取。 没有别的事情需要做!

  • 点符号 :如果您拥有@property则可以通过点符号访问getter和setter。

  self.myIvar = (id) someThing; [array addObject:self.myIvar]; 
  • 如果你需要你将iVar公开,写一个@property比写一个iVar的getter和setter更简单

  • 有了@property,你不需要在iVar中声明(在iOS和64位Mac OS X应用程序中)。 你可以通过@synthesize来做到这一点:

  @synthesize myiVar = _myIvar; 

@property是一个实例variables,它已经应用了一些语义糖,帮助将其暴露给外部世界(通常),并帮助避免编写样板代码来获取和设置它。

虽然属性通常是在需要访问某个类之外的variables时指定的,但是在目标C中,额外需要设置的属性是内存pipe理在编译器结束时进行,因此如果使用某个对象,而不是原始的数据types,那么你应该使用属性和综合它,然后释放dealloc如果你正在使用手动引用计数。 但是又一个主要的目标是使得它在类之外访问某个iVar的属性,就像从一个类传递参数到另外一个类一样。

如果你@synthesize @property ,你将有机会获得一个get和一个set方法,这是非常方便的。 你也可以定义setter将如何performance(保留,分配,复制)如果它是非primefaces的或primefaces的,如果它是只读的。 如果你没有指定任何东西(也就是说你没有合成属性),默认情况下,伊娃不会在课堂外可见,但是你可以通过使用@public来实现。 从逻辑上讲,您也可以将它们定义为@private@protected

通常情况下,我@property @synthesize一个@property因为我想从类的外部访问伊娃,也因为我想要一个getter和setter方法。

一般的意见是,你应该尽可能使用属性。 如果你仍然有疑问,这是苹果的build议:

一般来说,即使你在自己的实现中访问一个对象的属性,也应该使用访问器方法或点语法来访问属性,在这种情况下,你应该使用self

这个规则的例外是编写初始化,取消分配或自定义存取方法

您应该始终直接从初始化方法中访问实例variables,因为在设置属性时,对象的其余部分可能尚未完全初始化

在这里阅读整个文档以更好地理解这个主题。

至于性能问题,对于大多数应用来说,收益是微不足道的。 阅读这个了解详细的描述。