直接访问实例变量,不经过”方法派发“(method dispatch) 速度快。
直接访问实例变量,不会调用其“设置方法”,这就绕过了为相关属性所定义的“内存管理语义”。
直接访问实例变量,不会触发“键值观测”(Key-Value Observing, KVO)通知。
(KVO,一种通知机制,当某对象属性改变时,可通知其他对象。)
通过属性来访问有助于排查与之相关的错误,因为可以给“获取方法” or、and “设置方法” 中新增断点(breakpoint),监控该属性的调用者及其访问时机。
优化方案: 在对象内部读取数据时,应该通过实例变量来读,而写入数据时,则应通过属性(即setter方法)来写入。
在初始化方法及dealloc方法中,总是应该直接通过实例变量 来书写数据。
使用惰性初始化技术配置某份数据,需要通过属性来读取数据。
@interface EOCPerson : NSObject @property (nonatomic, copy) NSString *firstName; @property (nonatomic, copy) NSString *lastName; - (NSString *)fullName; - (void)setFullName:(NSString *) fullName; @end //实现方法 // 使用“点语法”,获取方法 - (NSString *)fullName { return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; } //设置方法 - (void) setFullName:(NSString *)fullName { NSArray *components = [fullName componentsSeparatedByStirng:@" "]; self.firstName = [components objectAtIndex:0]; self.lastName = [components objectAtIndex:1]; } //如果不经由存取方法,而是直接访问实例变量 - (NSString *) fullName { return [NSStringstringWithFormat:@"%@ %@", _firstName, _lastName]; } - (void) setFullName:(NSString *)fullName { NSArray *components = [fullName componentsSeparatedByStirng:@" "]; _firstName = [components objectAtIndex:0]; _lastName = [components objectAtIndex:1]; }