在开发过程中,lz长时间一直使用property进行声明变量,在和别人合作的项目中看到同时使用property和成员变量声明同一个变量,所以就去了解了一下属性和成员变量之间的区别,做一个总结。
1.使用property声明的变量
@interface UserModel : NSObject
@property (copy, nonatomic) NSString *name;
@end
编译器会自动生成一个实例变量和getter/setter方法,默认生成的实例变量是_name,可以直接调用self.name,在等式左边使用的时候代表调用的是[self setName:@""],在等式右边的时候代表调用的是get方法
@implementation UserModel
@synthesize name;
-(void)set{
name = @"1";
}
@end
在.m文件使用@synthesize name;则实例变量则是name而不是_name。
2.在{}声明的成员变量
@interface UserModel : NSObject
{
NSString *_name;
}
@end
需要手动实现getter/setter方法,而且这种方式声明的变量是私有的,外界无法进行访问
3.同时声明属性和成员变量
@interface UserModel : NSObject
{
NSString *_namer;
}
@property (copy, nonatomic) NSString *name;
@end
如果在.m文件中使用@synthesize name;测试属性和实例变量不是同一个实例变量
@implementation UserModel
@synthesize name;
-(void)set{
_name = @"a";
self.name =@"b";
NSLog(@"%@",_name);
NSLog(@"%@",self.name);
}
@end
会发现_name和name不是同一个变量,打印的结果是
2017-05-17 14:57:15.579 属性和实例变量[77675:8029119] _name:a
2017-05-17 14:57:15.579 属性和实例变量[77675:8029119] self.name:b
如果在.m文件中使用@synthesize name = _name;则此时属性和实例变量属于同一个实例变量
#import "UserModel.h"
@implementation UserModel
@synthesize name = _name;
-(void)set{
_name = @"a";
self.name =@"b";
NSLog(@"%@",_name);
NSLog(@"%@",self.name);
}
@end
打印的结果是
2017-05-17 14:56:49.497 属性和实例变量[77655:8028413] _name:b
2017-05-17 14:56:49.497 属性和实例变量[77655:8028413] self.name:b
如果在同时声明属性和实例变量时,需要通过使用@synthesize name = _name或不做任何处理,来使得两个实例变量是一样的