我已经阅读了一些关于iVars和属性之间差异的问题,如:Why would you use an ivar?
ios interface iVar vs Property
我想知道的是......如果我正在创建一个需要在UIViewController
中以多种方法访问的BOOL(例如),创建这些的最佳方法是什么?
目前我创造了属性。这工作正常,如预期的那样。但是当我阅读/了解更多时,似乎创建一个iVar会更好地表现。
像:
@interface ViewController : UIViewController{
BOOL myBool;
}
这对于性能会更好吗?如果我将值设置为YES,可以多个方法访问此iVar,我可以检查另一个中的值 - 我可以使用属性方法吗?
答案 0 :(得分:4)
如果我将值设置为YES,可以多个方法访问此iVar,我可以检查其他值中的值
当然,即使您将值设置为NO
,也可以。它是一个实例变量,因此在一个实例的所有方法之间共享。
这对性能会更好吗
不,除非您非常频繁地访问该属性,例如每帧2 ^ 20次。看看this Big Nerd Ranch post关于iVar与财产表现的关系。通常,性能提升不值得清晰损失。
答案 1 :(得分:3)
“更好的表现”对于影响应用程序非常罕见。编写代码以便清楚,然后如果存在性能问题配置文件并修复实际导致问题的代码。
答案 2 :(得分:1)
为了您的目的,ivar相当于使用财产。性能方面,ivar略胜一筹,因为你可以直接访问它,而使用属性可以调用编译器在后台生成的方法(getter或setter)。
但是,我不担心性能。通常差异可以忽略不计。除非你有一些特殊需要,否则我总是会使用属性,因为它通常会产生更清晰的代码。使用getter和setter方法也是一个好习惯 - 即使它们是由编译器为你生成的 - 因为它们封装了你的类的数据。答案 3 :(得分:1)
我通常会这样做:
@interface MyVC : UIViewController
@property (nonatomic, getter=isDoingSomething) BOOL doingSomething;
@end
我还在属性声明中明确命名getter,这使您可以以易于阅读的方式访问该属性。 (通过发送setDoingSomething来设置属性:getter是[theVC isDoingSomething])
iOS上建议使用非原子属性。关于我之前的反向,默认的原子行为会为合成代码添加锁定,出于性能原因不建议这样做。线程的任何问题都必须在您自己的setter中处理(使用ivar时无论如何都要做)。就个人而言,我没有遇到任何问题。
我不会重复关于性能的其他答案,但除了指出点击按钮发送的消息比访问属性更多的消息之外,因此性能损失是微不足道的。