在ios代码里,经常会看见以这种格式:_变量名 去命名一个变量,为什么? 其实这又是个基础概念知识,但发现实际上好多人好像却并不明了其中原由,只是看别人都这么写,也就这么写了,下面我就简单说一下这么做的原因。

刚接触ios开发时,我写的代码一般是这样的

@interface Person : NSObject

@property (nonatomic,copy) NSString *name;

@end

@implementation Person
@synthesize name;

-(void)talkMyName
{
NSString *myName = [NSString stringWithFormat:@”my name is %@”,name];
NSLog(@”%@”,myName);
}

@end

但你看很多书上或是别人代码可能是这样写的
@interface Person : NSObject

@property (nonatomic,copy) NSString *name;

@end
@implementation Person
@synthesize name = _name;//设置别名_name

-(void)talkMyName
{
NSString *myName = [NSString stringWithFormat:@”my name is %@”,_name];
NSLog(@”%@”,myName);
}

@end
区别主要在这一句

@synthesize name = _name;//设置别名_name
当时其实真的很不理解,不明白为什么要写这么一句,给name起一个别名_name,感觉好多余啊。但实际上,这种命名方式(_name)是苹果官方所推荐的,所以加上这么一句,以遵循苹果推荐的命名规则。而这种规则的好处是什么呢?

举一个例子,假如遇到下面这种情况

-(void)setMyName:(NSString *)name
{
?????
}
假如我的成员变量就用name,我该怎么写?
name = name? 显然不行

self.name = name ? 可此处假如我不想加self.呢?(加不加self.的区别,也是一个基础概念,这里不做说明)

那我只能改函数名为

-(void)setMyName:(NSString *)getName
{
name = getName;
}
好了,终于区分出成员变量和参数变量了
但如果我设置了_name别名,问题迎刃而解

-(void)setMyName:(NSString *)name
{
_name = name;
}
对,其实以_开头的目的就是简单的让编译器和开发者方便、明确的区分出成员变量和其他变量,就这么简单

后来,苹果为了推广这种命名规范,现在你的代码可以这样写了

@interface Person : NSObject

@property (nonatomic,copy) NSString *name;

@end
@implementation Person

-(void)talkMyName
{
NSString *myName = [NSString stringWithFormat:@”my name is %@”,_name];
NSLog(@”%@”,myName);
}

@end
不需要写@synthesize语句了,编译器自动就为带@property的成员变量分配好了别名(_变量名),直接用就好了。但不带@property的成员变量,就需要你自己按照规则去命名了(当然,你也可以继续一意孤行的不以_开头)
所以,现在的代码你*好都写成这样

@interface Person : NSObject
{
int _age;
NSString *_address;
}
@property (nonatomic,copy) NSString *name;

@end
自觉以_开头去命名成员变量