Objective-C 中的点表示法与方法调用之间的性能差异

Performance difference between dot notation versus method call in Objective-C

提问人:Ronnie Liew 提问时间:8/30/2008 最后编辑:Bill the LizardRonnie Liew 更新时间:4/18/2022 访问量:5396

问:

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

myObject.property = YES;

[myObject setProperty:YES];

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

Objective-C 性能

评论


答:

0赞 Daniel Jennings 8/30/2008 #1

据我所知,两者之间没有明显的性能差异。我有理由相信,在大多数情况下,它将被“编译”为相同的代码。

如果您不确定,请尝试编写一个测试应用程序,该应用程序可以执行每种方法一百万次左右,同时计时所需的时间。这是确定的唯一方法(尽管它可能因不同的体系结构而异)。

5赞 Misha M 8/30/2008 #2

查看可可是我的女朋友的文章。它的要点是,使用一个而不是另一个不会对性能造成影响。

但是,符号确实使查看变量发生了什么以及变量是什么变得更加困难。

21赞 Chris Hanson 8/30/2008 #3

在 Objective-C 中,属性访问的点表示法是一种消息发送,就像括号表示法一样。也就是说,鉴于此:

@interface Foo : NSObject
@property BOOL bar;
@end

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

最后两行的编译完全相同。唯一改变这一点的是,如果属性指定了 and/或属性;但是,它所做的只是更改发送的消息,而不是是否发送消息:gettersetter

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

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

最后两行的编译方式相同。

5赞 Kendall Helmstetter Gelner 9/15/2008 #4

唯一一次看到性能差异的情况是,如果您未将属性标记为“非原子”。然后,将围绕属性的设置自动添加同步代码,使其线程安全 - 但设置和访问速度较慢。@synthesize

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

@property (nonatomic, retain) NSString *myProp;

就我个人而言,我发现点表示法通常很有用,因为您不必考虑编写正确的 setter 方法,即使对于非原子 setter 方法也不是完全微不足道的,因为您还必须记住正确释放旧值。使用模板代码会有所帮助,但你总是会犯错误,而且通常是重复的代码会弄乱类。

需要注意的模式:如果您自己定义 setter(而不是让它创建它)并开始产生设置值的其他副作用,您可能应该将 setter 设置为普通方法,而不是使用属性表示法进行调用。@synthesize

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

0赞 charles 9/17/2008 #5

另请阅读这篇关于爱可可的博文:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

在那里,作者比较了 NSManagedObject 的自定义访问器和点表示法的速度,发现没有区别。但是,KVC 访问 (setValue:forKey:) 的速度似乎大约是原来的两倍。