今天我们来学一下@property和@synthesize语法,在我的前几篇博客中,我详细介绍了getter方法和setter方法的创建,我们再来回顾一下。
Student.h文件中声明
#import<Foundation/Foundtion.h>
@interface Student :NSObject{
int age;
int no;
}
-(int)age; //get方法
-(void)setAge:(int)newAge; //set方法
-(int)no;
-(void)setNo:(int)newNo;
@end
大家也感受到了,使用这种方法太繁琐了,占用了大量的代码数量,而且有很多冗余代码,下面我就来为大家介绍一种新的getter,setter方法。
1、@property语法,作用就是自动生成getter方法和setter方法的声明
声明property的语法为:
@property (参数1,参数2) 类型 名字;
如:
@property(nonatomic,retain) int age;
在这里我们先暂时忽略@property的参数,在后面的附录中我会给大家详细介绍
@property int age;
这一句代码就等价于
-(int)age; //get方法
-(void)setAge:(int)age; //set方法
也就是说我们完全可以这样写我们的getter方法和setter方法的声明
#import<Foundation/Foundtion.h>
@interface Student :NSObject{
int age;
int no;
}
@property int age;//age的getter、setter方法
@property int no; //no的getter、setter方法
@end
是不是简单了很多,
@property int _age;
当编译器遇到@property的时候自动展成以下方法:
-(int)_age; //get方法
-(void)set_age:(int) _age; //set方法
这两个方法是完全等价的
2、@synthesize语法,作用就是自动生成getter方法和setter方法的实现
有简洁声明也就会有相应的简洁实现,我们先来复习一下传统的实现方式
#inport"Student.h"
@implementation Student
-(int)age{
return age;
}
-(void)setAge:(int)newAge{
age=newAge;
}
-(int)no{
return no;
}
-(void)setNo:(int)newNo{
no=newNo;
}
@end
同样,我们也可以用两行代码解决上面这一大堆垃圾代码
#inport"Student.h"
@implementation Student @synthesize age;
@synthesize no;
@end
就这样简单,当编译器遇到 @synthesize age,的时候就自动展开成
-(int)age{
return age;
}
-(void)setAge:(int)newAge{
age=newAge;
}
还有几点大家需要特别注意的地方:
1.@synthesize age 会自动去访问跟age同名的变量。
2.如果找不到则生成跟age同名的私有变量
@synthesize 还有一种写法是
@implementation Person @synthesize name = _name;
@synthesize sex = _sex;
@synthesize age = _age;
@end
表示实现3个 setter 和 getter 方法,其中 name = _name 表示说在 getter 和 setter 方法中操作的实例变量是 _name,如果省略了 _name ,_age, _sex, 那么会在. h 文件中生成同名的实例变量 name,sex,age(注意:这里并没有下划线),此时生成的 setter 和 getter 方法所操作的实例变量是 name,sex,age, 所以_name,_sex,_age 并没有被操作。
在 ios5.0后,@synthesize也可以省略不写,此时在. h 文件中只写@ property 即可,编译器会自动生成相应的实例变量,实例变量的名字是属性名称前加下划线.
声明property的语法为:
@property (参数1,参数2) 类型 名字;
其中参数主要分为三类:
读写属性: (readwrite/readonly/setter = /getter = )
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite
产生setter\getter方法
readonly
只产生简单的getter,没有setter, 默认的读写属性.
setter =
指定生成setter方法的名字
getter =
指定生成getter方法的名字
assign
默认类型,setter方法直接赋值,而不进行retain操作, 适用于基本数据类型, 对对象类型, 不会发生引用计数变化.
retain
setter方法对参数进行release旧值,再retain新值。
copy
setter方法进行Copy操作,与retain一样
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
nonatomic
禁止多线程,变量保护,提高性能
参数中比较复杂的是retain和copy,具体分析如下:
一、getter分析
1.
@property(nonatomic,retain)test* thetest;
@property(nonatomic ,copy)test* thetest;
等效代码:
-(test*)thetest {
return thetest;
}
2.
@property(retain)test* thetest;
@property(copy)test* thetest;
等效代码:
-(test*)thetest
{
[thetest retain];
return [thetest autorelease];
}
二、setter分析
1、
@property(nonatomic,retain)test* thetest;
@property(retain)test* thetest;
等效于:
-(void)setThetest:(test *)newThetest { if (thetest!= newThetest) { [thetest release]; thetest= [newThetest retain]; } }
2、
@property(nonatomic,copy)test* thetest;
@property(copy)test* thetest;
等效于:
-(void)setThetest:(test *)newThetest { if (thetest != newThetest) { [thetest release]; thetest= [newThetest copy]; } }
IOS开发基础Object-C—05OC变量的作用域、self
http://blog.csdn.net/u010037928/article/details/49585057
IOS开发基础Object-C— 04构造方法和description方法
http://blog.csdn.net/u010037928/article/details/49557069
IOS开发基础Object-C——03点语法
http://blog.csdn.net/u010037928/article/details/49534683
IOS开发基础Object_C——02 第一个OC类
http://blog.csdn.net/u010037928/article/details/49519709
IOS开发基础Object_C——01 OC概述及比较
http://blog.csdn.net/u010037928/article/details/49515627
MJ老师视频地址
OC@property和@synthesize http://pan.baidu.com/s/1nt3sRw9