ios属性讲解(property和synthesize区别)

xiaoxiao2021-02-28  64

属性的改变步骤property和synthesize的区别 刚刚接触ios,后来学习别人代码的时候,发现定义属性有时候会写在m文件@inferface和end之间或者有时候还会涉及到@synthesize。后来才发现原来是随着ios的版本不断增加,属性的写法也多多少少有些区别. 目前属性的声明: @property (nonatomic,strong) NSString *myTitle; 当我们声明一个属性的时候,编译器会为我们自动生成对应的实例变量_myTitle,当然,我们也可以在.m文件通过关键字synthesize手动生成对应的实例变量myTitle。这样引用的时候就可以不用加下划线了 首先我们要知道属性是OC的一种新的语言机制,声明的属性必须有对应的实例变量 一、属性的改变步骤: 在苹果使用LLVM编译器之前,属性的使用方式是:手动声明实例变量,代码如下: .h文件: @interface ViewController : UIViewController { // 属性的实例变量 NSString *mytitle; } @property(copy,nonatomic) NSString *myTitile; @end 对应的.m文件 //编译器遇到@synthesize会自动实现setter和getter方法 //编译器遇到@synthesiz会去访问同名的myTitle,如果没有找到就会报错。 @synthesize myTitle 而苹果开始使用LLVM编译器后,编译器就可以自动为属性生成一个带下划线名字的实例变量 属性改变步骤 第一版: .h文件: @interface ViewController : UIViewController { // 属性的实例变量 NSString *mytitle; } @property(copy,nonatomic) NSString *myTitile; @end 对应的.m文件 //编译器遇到@synthesize会自动实现setter和getter方法 //编译器遇到@synthesiz会去访问同名的myTitle,如果没有找到就会报错。 @synthesize myTitle 第二版 不需要自己手动声明一个成员变量,关键字@synthesize会默认去访问myTitle的同名变量,如果找不到则会自动生成一个 .h文件 @property (nonatomic,strong) NSString *myTitle; .m文件 //编译器遇到@synthesize会自动实现setter和getter方法,访问同名变量myTitle。如果找不到的话会自动创建一个私有同名变量myTitle,因此之后可以不用手动声明一个实例变量 @synthesize myTitle; 第三版 考虑到变量名和getter的方法名、setter的参数名一样,引起警告,所以默认给属性生成的同名变量带下划线 .m文件 //指定_myTitle作为myTitle的实例变量 @synthesize myTitle = _myTitle; 第四版 随着ios升级,@synthesize也可以省略了,只用在.h文件中声明属性即可 @property (nonatomic,strong) NSString * myTitle; 总结:声明属性的时候编译器自动生成的实例变量,实例变量的本质是成员变量,self.myTitle操作属性的时候实质上是在操作成员变量_myTitle(也就是实例变量) 二、property和synthesize的区别 synthesize的作用: 1、让编译器自动生成setter和getter方法 2、指定与属性对应的实例变量:如果在.m文件写了@synthesize xxx,那么生成的实例变量就是xxx;如果没有写的话则就是_xxx。 在之前的版本中‘,@property只能写在.h文件中,而@synthesize只能写在.m文件中。而现在@property就独揽了@property和@synthesize的功能。 @property(nonatomic,strong) NSString * xxx 这句话实现了3个功能: 1)生成_str成员变量的get和set方法 2)生成_str成员变量set和get方法的实现 3)生成一个_str的成员变量(私有的) 总结:声明属性的时候编译器自动生成的实例变量,实例变量的本质是成员变量,self.myTitle操作属性的时候实质上是在操作成员变量_myTitle(也就是实例变量)
转载请注明原文地址: https://www.6miu.com/read-21646.html

最新回复(0)