Ron*_*iew 12 performance objective-c
您可以在Objective-C中使用标准点表示法或方法调用来访问Objective-C中对象的属性.
myObject.property = YES;
Run Code Online (Sandbox Code Playgroud)
要么
[myObject setProperty:YES];
Run Code Online (Sandbox Code Playgroud)
性能方面是否存在差异(访问财产方面)?在编码风格方面,这只是一个偏好问题吗?
Chr*_*son 19
Objective-C中属性访问的点表示法是一种消息发送,就像括号表示法一样.就是这样:
@interface Foo : NSObject
@property BOOL bar;
@end
Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];
Run Code Online (Sandbox Code Playgroud)
最后两行编译完全相同.唯一改变这一点的是,如果属性指定了一个getter
和/或setter
属性; 但是,它所做的只是更改发送的消息,而不是是否发送消息:
@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end
if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
最后两行的编译都是相同的.
唯一会看到性能差异的情况是您没有将属性标记为“非原子”。然后@synthesize
将自动在属性设置周围添加同步代码,保持线程安全 - 但设置和访问速度较慢。
因此,大多数情况下您可能想要定义一个属性,例如:
@property (nonatomic, retain) NSString *myProp;
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我发现从您不必考虑编写正确的 setter 方法的角度来看,点表示法通常很有用,即使对于非原子 setter 来说,这也不是完全微不足道的,因为您还必须记住正确释放旧值。使用模板代码会有所帮助,但您总是会犯错误,而且通常是重复的代码使类变得混乱。
需要注意的模式:如果您自己定义 setter(而不是让@synthesize
创建它)并开始产生设置值的其他副作用,您可能应该使 setter 成为普通方法,而不是使用属性表示法进行调用。
从语义上讲,使用属性似乎是直接访问调用者的实际值,因此任何与此不同的内容都应该通过发送消息来完成,而不是访问属性(即使它们实际上都在发送消息)。