@interface EOCPerson : NSObject
//在对象外访问实例变量时,总是应该通过属性来做。
//对象内呢?
//建议:读取实例变量的时候采用直接访问的形式,设置实例变量时通过属性来做
@property (nonatomic,copy) NSString *firestName;
@property (nonatomic,copy) NSString *lastName;
@property (nonatomic,copy) NSString *brain;
-(NSString *)fullName;
-(void)setFullName:(NSString *) fullName;
@end
#import "EOCPerson.h"
@implementation EOCPerson
//运用点语法实现
//-(NSString *)fullName
//{
// return [NSString stringWithFormat:@"%@ %@",self.firestName,self.lastName];
//}
//-(void) setFullName:(NSString *)fullName
//{
// NSArray *components = [fullName componentsSeparatedByString:@" "];
// self.firestName = [components objectAtIndex:0];
// self.lastName = [components objectAtIndex:1];
//}
//直接访问实例变量
-(NSString *)fullName
{
return [NSString stringWithFormat:@"%@ %@",_firestName,_lastName];
}
-(void)setFullName:(NSString *)fullName
{
NSArray *components = [fullName componentsSeparatedByString:@" "];
_firestName = [components objectAtIndex:0];
_lastName = [components objectAtIndex:1];
}
/**这两种写法的区别
* 1.直接访问实例变量的速度比较快
2.直接访问实例变量,绕过了属性的定义,比如copy 属性,并不会拷贝,只会保留新值并释放旧值
3.直接访问实例变量,不会触发kvo 键值观测
4.通过属性来访问,有助排查相关错误,因为可以在方法内打断点
*/
//折中方案,在写入实例变量时,通过属性“设置”方法来做,读取实例变量时,则直接访问
/**
* 在初始化方法种,应该直接访问实例变量:这样可以提高读取速度,又能控制对属性的写入操作
*/
/**
* 惰性初始化:这种情况下,必须通过“获取方法”来访问属性,否则实例变量就永远不会初始化。
*/
-(NSString *)brain
{
if (!_brain){
_brain = [NSString new];
}
return _brain;
}
@end