在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
/weak
和retain
/copy
/assign
)。 -
来自其他类的可访问性 :如果您在.h中声明了
@property
,并且在.m中声明了它,那么您的ivar将是公共可读和可写的。 你可以用privat类扩展来防止这种情况。 你甚至可以声明一个@property
publicreadonly
并通过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,因为在设置属性时,对象的其余部分可能尚未完全初始化
在这里阅读整个文档以更好地理解这个主题。
至于性能问题,对于大多数应用来说,收益是微不足道的。 阅读这个了解详细的描述。