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