您可以在Objective-C中使用标准点表示法或方法调用来访问Objective-C中对象的属性。
myObject.property = YES;
或
[myObject setProperty:YES];
性能方面是否存在差异(访问财产方面)?在编码风格方面,这只是一个偏好问题吗?
答案 0 :(得分:19)
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) { /* ... */ }
最后两行的编译方式相同。
答案 1 :(得分:4)
结帐article from Cocoa is My Girlfriend。它的要点是,使用其中一个没有性能损失。
但是,符号确实会让您更难以了解变量的变化以及变量的变化。
答案 2 :(得分:4)
如果您没有将属性标记为“非原子”,则唯一一次您会看到性能差异。然后@synthesize将自动在您的属性设置周围添加同步代码,保持线程安全 - 但设置和访问速度较慢。
因此,您可能希望定义一个属性,如:
@property(nonatomic,retain)NSString * myProp;
我个人认为,从你不必考虑编写正确的setter方法的角度来看,点符号通常是有用的,即使对于非原子setter也不是完全无关紧要的,因为你还必须记得正确释放旧值。使用模板代码会有所帮助,但总是会犯错误,而且通常是重复的代码会使类混乱。
要注意的模式:如果您自己定义setter(而不是让@synthesize创建它)并开始设置值的其他副作用,您应该使setter成为普通方法而不是使用属性调用符号。
在语义上使用属性似乎是对调用者的实际值的直接访问,因此通过发送消息而不是访问属性(即使他们实际上都在发送消息),应该通过这些来改变。
答案 3 :(得分:0)
据我所见,两者之间没有显着的性能差异。我有理由相信,在大多数情况下,它会被“编译”为相同的代码。
如果您不确定,请尝试编写一个测试应用程序,每个方法执行一百万次左右,一直计算需要多长时间。这是确定的唯一方法(虽然它可能因不同的架构而有所不同。)
答案 4 :(得分:0)
另请阅读关于Cocoa with Love的博客文章:
http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html
作者在那里比较了NSManagedObject的自定义访问器和点表示法的速度,并发现没有区别。但是,KVC访问(setValue:forKey :)似乎慢了两倍。