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

来源:互联网 发布:机械加工工艺编制软件 编辑:程序博客网 时间:2024/06/05 09:27
  1. 属性的改变步骤
  2. 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(也就是实例变量)