Ios 将布尔声明为iVar或属性的最佳途径

Ios 将布尔声明为iVar或属性的最佳途径,ios,objective-c,uiviewcontroller,ivar,Ios,Objective C,Uiviewcontroller,Ivar,我已经阅读了一些关于IVAR和类似属性之间差异的问题: 我想知道的是。。。如果我正在创建一个需要在UIViewController中以多种方法访问的BOOL(例如),那么创建这些BOOL的最佳方法是什么 目前我创建properties。这很好,正如预期的那样。但随着我阅读/学习的深入,似乎创建iVar对性能更有利 比如: @interface ViewController : UIViewController{ BOOL myBool; } 这对性能有好处吗?多个方法是否可以访问此iVar?

我已经阅读了一些关于IVAR和类似属性之间差异的问题:

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

目前我创建properties。这很好,正如预期的那样。但随着我阅读/学习的深入,似乎创建iVar对性能更有利

比如:

@interface ViewController : UIViewController{
BOOL myBool;
}

这对性能有好处吗?多个方法是否可以访问此iVar?如果我在其中一个方法中将值设置为“是”,我是否可以在另一个方法中检查值?就像使用属性方法一样?

影响应用程序的“更好的性能”是非常罕见的。为清晰起见,请编写代码,然后如果存在性能问题,请配置文件并修复实际导致问题的代码。

影响应用程序的“更好的性能”是非常罕见的。为清晰起见,请编写代码,然后如果存在性能问题,请配置文件并修复实际导致问题的代码。

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


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

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

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

多个方法是否可以访问此iVar?如果我在一个方法中将值设置为“是”,是否可以在另一个方法中检查值

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

这对性能有好处吗

不,除非您经常访问该属性,例如每帧2^20次。看看iVar与物业绩效的对比。通常情况下,性能的提高不值得清晰度的损失

多个方法是否可以访问此iVar?如果我在一个方法中将值设置为“是”,是否可以在另一个方法中检查值

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

这对性能有好处吗


不,除非您经常访问该属性,例如每帧2^20次。看看iVar与物业绩效的对比。通常,性能的提高不值得清晰度的损失。

我通常这样认为:

@interface MyVC : UIViewController
@property (nonatomic, getter=isDoingSomething) BOOL doingSomething;
@end
我还在属性声明中显式地命名getter,这使您能够以易于阅读的方式访问属性。(设置属性是通过发送setDoingSomething:完成的,getter是[theVC isDoingSomething])

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


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

我通常会这样说:

@interface MyVC : UIViewController
@property (nonatomic, getter=isDoingSomething) BOOL doingSomething;
@end
我还在属性声明中显式地命名getter,这使您能够以易于阅读的方式访问属性。(设置属性是通过发送setDoingSomething:完成的,getter是[theVC isDoingSomething])

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


我不会重复关于性能的其他答案,但我要指出的是,点击按钮发送的消息比访问属性发送的消息要多得多,因此性能损失很小。

你已经把它们倒过来了。在处理线程时,原子避免了部分值和截断的对象生存期。非原子不会试图避免这些问题。你是对的,我修正了我的答案。另外,由于问题是关于创建BOOL属性,而BOOL不是对象,所以问题很简单,“我希望添加锁(原子锁)还是不添加锁(非原子锁)如果需要,我自己做。我说得对吗?对于单个布尔值,大多数体系结构上的原子性不需要锁定。运行时会做正确的事情,不会不必要地锁定:)它们是反向的。原子在处理线程时会避免部分值和截断对象生存时间。非原子不会尝试这样做o避免这些问题。你是对的,我修正了我的答案。而且因为问题是ab