您可以使用标准的点符号或Objective-C中的方法调用来访问对象的属性。
myObject.property = YES;
或者[myObject setProperty:YES];
在访问属性方面,性能有差异吗?这只是编码风格上的偏好问题吗?
您可以使用标准的点符号或Objective-C中的方法调用来访问对象的属性。
myObject.property = YES;
或者[myObject setProperty:YES];
在访问属性方面,性能有差异吗?这只是编码风格上的偏好问题吗?
@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) { /* ... */ }
最后两行代码编译结果相同。
只有当您没有将属性标记为“nonatomic”时,才会看到性能差异。然后,@synthesize
将自动在设置属性时添加同步代码,使其线程安全-但设置和访问速度较慢。
因此,大多数情况下,您可能希望定义一个属性,例如:
@property (nonatomic, retain) NSString *myProp;
需要注意的一种模式:如果你自己定义了setter(而不是让@synthesize创建它),并开始拥有设置值的其他副作用,那么你应该将setter变成普通方法,而不是使用属性符号调用。
从语义上讲,使用属性似乎直接访问实际值给调用者,任何与此不同的内容都应该通过发送消息而不是访问属性来完成(即使它们实际上都是发送消息)。
同时阅读 Cocoa with Love 上的这篇博客文章:
http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html
在这里,作者比较了自定义访问器和NSManagedObject的点符号表示法的速度,并发现它们没有区别。然而,KVC访问(setValue:forKey :))似乎要慢大约两倍。