【问题标题】:The best route to declare a BOOL as iVar or Property将 BOOL 声明为 iVar 或 Property 的最佳途径
【发布时间】:2013-10-26 15:32:03
【问题描述】:

我已经阅读了一些关于 iVar 和 Properties 之间区别的问题,例如:Why would you use an ivar?
ios interface iVar vs Property

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

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

喜欢:

@interface ViewController : UIViewController{
BOOL myBool;
}

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

【问题讨论】:

    标签: ios objective-c uiviewcontroller ivar


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        这对性能会更好吗

        不,除非您非常非常频繁地访问该属性,例如每帧 2^20 次。看看this Big Nerd Ranch post 关于 iVar 与物业性能的对比。通常,性能提升不值得失去清晰度。

        【讨论】:

        • 接受清楚地回答问题的所有部分并链接到有关性能的更多信息。
        【解决方案4】:

        我通常会这样做:

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

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

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

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

        【讨论】:

        • 你把它们弄反了。 Atomic 在处理线程时避免部分值和截断对象生命周期。 Nonatomic 不会试图避免这些问题。
        • 你是对的,我修正了我的答案。此外,由于问题是关于创建一个 BOOL 属性,而 BOOL 不是一个对象,所以它很简单,“我想要添加锁(原子)还是不添加(非原子),如果需要,我自己做。我是否正确?
        • 在单个布尔值的情况下,大多数架构上的原子性不需要锁定。运行时会做正确的事情并且不会不必要地锁定:)
        猜你喜欢
        • 2012-11-23
        • 1970-01-01
        • 2016-07-28
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多