美文网首页
property属性和成员变量的区别

property属性和成员变量的区别

作者: happyws | 来源:发表于2017-05-17 15:03 被阅读0次

在开发过程中,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或不做任何处理,来使得两个实例变量是一样的

相关文章

网友评论

      本文标题:property属性和成员变量的区别

      本文链接:https://www.haomeiwen.com/subject/ncldxxtx.html