我使用Objective-C属性为我处理保留/释放实例变量。在我的班上,我做这样的事情:
self.myProperty = somethingIWantToRetain
[self.myProperty doSomeAction]
[self.myProperty doSomethingElse]
使用[self myProperty] / self.myProperty比简单地使用myProperty更慢,因为那些我没有改变myProperty值的行吗?例如,以下会更快吗?
self.myProperty = somethingIWantToRetain
[myProperty doSomeAction]
[myProperty doSomethingElse]
由于
答案 0 :(得分:5)
几乎肯定会慢一点,但这不太重要。
直接参考您的ivar(使用裸myProperty
)直接访问变量。引用您的属性getter(使用等效的self.myProperty
或[self myProperty]
)必须调用一个方法,该方法通常会在您的ivar上执行retain
和autorelease
。
然而,Objective-C中的方法调度非常非常快,并且retain / autorelease调用也非常便宜,特别是对于在清除自动释放池时可能不会被破坏的对象。我会专注于可读性和一致的风格,只有当你明白你有追逐的性能瓶颈时才会担心性能。
答案 1 :(得分:4)
准确地说,当你编写[myProperty doSomeAction]
时,你实际上并没有访问该属性,而是直接访问实例变量(用作属性的支持变量)。
你只能使用点符号[self.myProperty doSomeAction]
访问属性(通过它的setter和getter)(或者通过像[[self myProperty] doSomeAction]
那样明确地调用setter / getter,这是完全等价的,因为这就是编译器在编译代码时转换为
因此,当您编写[myProperty doSomeAction]
时,因为它直接访问变量 - 与调用[self.myProperty doSomeAction]
的getter的myProperty
相反,从而进行额外的方法调用/消息发送 - 然后是理论它会更快,因为你将获得一个消息发送。
但实际上你不会看到任何改进,所以没有必要考虑直接访问变量(如果你想以后的方式再实现它,它会让你失去灵活性)。
此外,如果您使用Modern Runtime(如果您为任何版本的iOS编写代码,Legacy Runtime仅用于32位Mac OSX),则不需要为该属性显式定义支持变量了。因此,您可以在.h中声明@property
,在.m中声明@synthesize
而不使用任何实例变量(编译器将在编译时为您生成),在这种情况下,您不会能够调用(不存在的)实例变量! (至少不在@synthesize
指令之前)
答案 2 :(得分:2)
使用Objective-C 2.0点语法相当于调用getter,因此第一个片段会慢一些,因为你会产生两个额外的动态调度。
话虽如此,损失将是微不足道的,显然你将获得以后能够更改setter和getter的灵活性(例如,如果你最终隐藏了这个值,那么它在技术上并不存储在内存中,或将其传递给第三个对象,或者做一些异步存储,可能需要你在某些情况下阻止getter。)
答案 3 :(得分:2)
在运作的另一个步骤中变慢了?是。 较慢,如明显或现实较慢?绝对不是。
你必须记住,现代cpu运行程序每秒运行数百万次。在几乎所有语言中,调用getter方法与访问ivar本身的速度基本相同(特别是当getter方法中没有其他代码时)。
使用getter而不是直接访问ivars是一个好习惯,所以我不会试图通过忽略它来“加快速度”。
答案 4 :(得分:1)
是的,它会稍微快一些,但是你不太可能通过这种微优化来显着提高性能。如果您使用self.myProperty
,您可以稍后决定实施不同的访问者方法,而无需在任何地方更改代码。