建议的做法是在后ARC环境中使用属性,包括通过类扩展而不是ivar的私有属性(init和dealloc除外)。
除了推荐的做法之外,使用ivar代替财产的人有哪些主要缺点?我试图说服一些人进行转换,但有些人认为ivar的工作原理也一样快。所以我想收集好的可靠论据,而不是给出诸如“更好,更一致等等”的软性陈述。"
答案 0 :(得分:1)
你的问题没有正确答案,只有意见。所以你会得到不同的答案,这是一个添加到你的收藏: - )
不建议使用私有属性,这在很大程度上是一种时尚。 : - )
公共属性是类的封装的一部分 - 实现的属性(或方法)与用户无关,只与行为相关。 / p>
一个类不需要隐藏它自己的实现方式!
因此,私有属性的唯一用例是它们以方便的方式提供某些行为来实现类,而不是隐藏该行为。
如果类是从另一个类获取可变字符串并且需要保留其当前值,则具有copy
属性的私有属性可能很方便。
如果该类希望在需要时懒惰地构造一个值,但在那之后保留它,那么属性可以方便地处理它。当然,方法或函数以及属性毕竟只是方法调用。
选择思考方便/代码设计而不是封装,就像对公共属性一样。大多数情况下,你可能只是使用实例变量,就像你只使用局部变量一样。
HTH
答案 1 :(得分:0)
在性能方面没有太大差异。实际上,属性是生成访问器的实例变量。因此,您想要执行属性的原因是因为生成KVO通知的代码和setter / getter方法是为您生成的。因此,您可以减少在所有类上重复编写代码的时间。
答案 2 :(得分:0)
在某些情况下,使用私有属性比使用实例变量更好或更需要:
最后一点最好用一个例子来说明。正如许多人所知,在某些条件下,您可以在块中创建引用循环,这可以使用对self
的弱引用来打破。问题是您无法使用弱引用访问ivar,因此您需要一个属性。
__weak typeof(self) weakSelf = self;
[self.something someReferenceCycleBlock:^{
weakSelf->_someIvar = ... // this gives an error
weakSelf.someProperty = ... // this is fine
}];
基本上,如果这些点都不适用,请使用ivar。如果在课程的整个生命周期中任何一个可能适用,请使用私有属性。