我有一个在整个UIViewController中使用的NSArray对象。我可以将其声明为ivar或属性。两种方法都有任何优势(考虑到我使用ARC)?
选项1:
@interface MyViewController {
NSArray *_myArray;
}
@end
选项2:
@interface MyViewController
@property (strong, nonatomic) NSArray *myArray;
@end
答案 0 :(得分:1)
属性和ivars在概念上完全不同。
属性表示代码的逻辑组件。它可能(但不一定)由伊瓦尔支持。它可以是在运行时计算的动态生成(如视图的-frame
)等。
ivar 是一个实际分配的内存块,包含一些数据。
如果您使用属性(正确),您可以获得很好的功能,如KVC / KVO合规性。由于这个原因和其他原因,通常认为这是一种很好的做法,特别是在现代运行时,以属性的形式声明所有公共接口,并在内部用ivars(通常使用@synthesize
)支持它们,如果合适的话
就个人而言,我更喜欢使用私有数据的属性,以便在我想要的时候轻松公开(只需将声明移到标题!)并轻松提供属性的自定义实现(和setter / mutators)而不是依靠一个简单的ivar。
既然你提到了ARC,我还没有太多地使用它,但我认为只要你正确宣布你的财产就不会有太大的影响。