Objective-C中使用点操作符和方法调用之间的性能差异

13

您可以使用标准的点符号或Objective-C中的方法调用来访问对象的属性。

myObject.property = YES;
或者
[myObject setProperty:YES];

在访问属性方面,性能有差异吗?这只是编码风格上的偏好问题吗?

5个回答

21
在Objective-C中,使用点表示法访问属性也是一种消息发送方式,与使用方括号相同。也就是说,给定以下代码:
@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

最后两行代码的编译结果完全相同。唯一能改变这一点的是,如果属性指定了getter和/或setter特性;不过,它只会改变发送的信息而不是是否发送消息:

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

最后两行代码编译结果相同。


5

只有当您没有将属性标记为“nonatomic”时,才会看到性能差异。然后,@synthesize将自动在设置属性时添加同步代码,使其线程安全-但设置和访问速度较慢。

因此,大多数情况下,您可能希望定义一个属性,例如:

@property (nonatomic, retain) NSString *myProp;

个人认为点符号表示法通常很有用,因为你不必考虑编写正确的setter方法,即使是对于非原子setter,这也并不完全微不足道,因为你还必须记得正确释放旧值。使用模板代码可以帮助,但你仍然可能犯错,并且通常会使类变得混乱。

需要注意的一种模式:如果你自己定义了setter(而不是让@synthesize创建它),并开始拥有设置值的其他副作用,那么你应该将setter变成普通方法,而不是使用属性符号调用。

从语义上讲,使用属性似乎直接访问实际值给调用者,任何与此不同的内容都应该通过发送消息而不是访问属性来完成(即使它们实际上都是发送消息)。


5

请查看《Cocoa is My Girlfriend》中的文章。文章的主旨是,使用其中任意一种方法都不会对性能造成影响。

然而,这种表示法确实使得变量的操作和内容更加难以理解。


0
就我所见,这两种方法之间没有显著的性能差异。我相当确定,在大多数情况下,它们都会被“编译”成相同的代码。
如果你不确定,可以尝试编写一个测试应用程序,分别执行这两种方法一百万次左右,并计时。这是唯一确定的方法(尽管在不同的架构上可能会有所不同)。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接