2012-08-02 122 views
0

我有一个在我的UIViewController中使用的NSArray对象。我可以声明它是一个ivar或作为一个财产。这两种方法有什么优势(考虑到我正在使用ARC)?ARC:成员变量和属性之间有什么区别?

选项1:

@interface MyViewController { 
    NSArray *_myArray; 
} 
@end 

选项2:

@interface MyViewController 
    @property (strong, nonatomic) NSArray *myArray; 
@end 

回答

1

属性和实例变量是概念上完全不同。

A 属性表示您的代码的逻辑组件。它可能,但不一定是由伊娃支持的。这可能是在运行时计算 动态生成 (像一个视图的-frame)等

一种的ivar是保持某些数据的存储器的实际分配的块。

如果您使用属性(正确),您将获得很好的功能,如开箱即用的KVC/KVO合规性。由于这个原因和其他原因,人们经常认为这是一种很好的做法,尤其是在现代运行时期,以属性的形式声明所有公共接口,并在适当情况下使用ivars(经常使用@synthesize)对其进行内部备份。

就我个人而言,我更喜欢使用私有数据的属性,这样既可以让我更容易在稍后公布,也可以轻松地提供属性的自定义实现(和setter/mutators),而不是依靠一个简单的伊娃。

既然你提到ARC,我还没有使用太多(但),但我不认为它应该有很大的区别,只要你声明你的属性是正确的。

+0

我的问题是专门为私人数据。感谢您的解释。 – melsam 2012-08-02 23:12:05

+0

就ARC而言,属性和iVar在大多数情况下都会消除它们之间的差异。以前,您必须确保将变量设置为属性,因为它们存在未被正确保留的风险。现在,在ARC中, – 2012-08-02 23:12:09

+0

我从来没有听说过没有与它有关的ivar的属性,使用@dynamic仅仅意味着访问者将在代码的稍后某处提供,所以编译器不必为你找到它们。除非你的意思是让这些访问器执行其他不向ivars释放的东西,在这种情况下,我认为它会破坏目的。 – Pochi 2012-08-02 23:16:32

相关问题