1

我已经阅读了一些关于 iVar 和 Properties 之间差异的问题,例如:为什么要使用 ivar?
ios 接口 iVar vs 属性

我想知道的是......如果我正在创建一个需要以多种方法访问的 BOOL UIViewController(例如),那么创建这些的最佳方法是什么?

目前我创建属性。这可以正常工作并且符合预期。但是当我阅读/了解更多时,似乎创建 iVar 会更好地提高性能。

喜欢:

@interface ViewController : UIViewController{
BOOL myBool;
}

这对性能会更好吗,如果我将一个值设置为 YES,多个方法可以访问这个 iVar,我可以检查另一个值吗 - 就像我可以使用属性方法一样?

4

4 回答 4

4

如果我在一个中将值设置为 YES,多个方法可以访问此 iVar,我可以检查另一个中的值吗

当然可以,即使您将值设置为NO. 它是一个实例变量,因此在一个实例的所有方法之间共享。

这对性能会更好吗

不,除非您非常非常频繁地访问该属性,例如每帧 2^20 次。看看 这篇关于 iVar 与物业表现的 Big Nerd Ranch 帖子。通常,性能增益不值得失去清晰度。

于 2013-10-17T23:05:30.853 回答
3

“更好的性能”很少会影响应用程序。为清楚起见编写代码,然后如果存在性能问题,请修复实际导致问题的代码。

于 2013-10-17T22:56:09.867 回答
1

出于您的目的,ivar 将等同于使用属性。在性能方面,ivar 稍好一些,因为您可以直接访问它,而使用属性可以调用由编译器在后台生成的方法(getter 或 setter)。

不过,我不会担心性能。通常,差异可以忽略不计。除非您有一些非常特殊的需要,否则我总是会使用属性,因为它通常会产生更清晰的代码。拥有 getter 和 setter 方法也是一个好习惯——即使它们是由编译器为你生成的——因为它们封装了你的类的数据。

于 2013-10-17T23:03:04.217 回答
1

我通常会这样做:

@interface MyVC : UIViewController
@property (nonatomic, getter=isDoingSomething) BOOL doingSomething;
@end

我还在属性声明中明确命名了 getter,它使您能够以易于阅读的方式访问该属性。(设置属性是通过发送 setDoingSomething: 来完成的,getter 是 [theVC isDoingSomething])

推荐在 iOS 上使用非原子属性。关于我之前的倒退,默认的原子行为会为合成代码添加锁,出于性能原因不推荐使用。线程的任何问题都必须在您自己的 setter 中处理(使用 ivar 时您无论如何都必须这样做)。就我个人而言,我没有遇到任何问题。

我不会重复有关性能的其他答案,但除了指出点击按钮发送的消息比访问属性更多的事实之外,因此性能损失是微不足道的。

于 2013-10-18T01:07:11.703 回答