- 在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,应该通过属性来写。
- 在初始化方法及
dealloc
方法中,总是应该直接通过实例变量来读写数据。
/// 初始化方法中使用实例变量来读写数据
-(id)initWithFirstName: (NSString *)firlstName
lastName:(NSString *) lastName {
if (self = [super init]) {
_firstName = [firstName copy]
_lastName = [lastName copy] // 推荐用copy
}
return self
}
/// 通过实例变量来读
-(NSString *)fullName{
return [NSStringstringWithFormat:@"%@ %@", _firstName, _lastName]
}
/// 通过属性访问来赋值
-(void)setLastName:(NSString*)lastName {
self.lastName = lastName
}
- 有时使用惰性初始化技术配置某份数据,这种情况下,需要通过属性来读取数据。
/// 惰性初始化,需要使用属性来读取数据,直接实例变量会看到未设置好的brain。
-(EOCBrain *)brain {
if (!_brain) {
_brain = [Brain new]
}
return _brain
}
通过属性访问与直接范文区别
- 直接访问实例变量,不需要经过方法派发,速度较快,因为会直接访问保存对象实例变量的那块内存地址。
- 直接访问实例变量,不会调用“设置方法”,绕过了为相关属性所定义的“内存管理语义”。例如
copy
,不会拷贝,只会保留新值并释放旧值。
- 直接访问实例变量不会触发KVO。
- 通过属性来访问有助于排查与之相关的错误。断点调试。