一.setter和getter的一般写法
- (void)setAge:(int)newAge;
- (int)age;
然后在.m
文件中具体实现
- (void)setAge:(int)newAge
{
age=newAge;
}
- (int)age
{
return age;
}
可以看出来,在Objective-C
中setter
器没什么区别,不过getter
器的方法名缺少了get
,因为get
在Objective-C
有别的用处,所以getter
器直接写的就是变量名。
二、getter和setter 的调用方法
一般的调用方法,是传统的带中括号[ ]
的调用方法,比如
//比如上面的声明是一个Person类
Person* person=[[Person alloc]init];
[person setAge:13];
int age=[person age];
点调用的方式
//点调用
person.age=13; //.调用出现在=号左边,相当于setter
int age=person.age //.调用出现在=号的右边,相当于getter
NSLog(@"%i",person.age);//这也是getter
三、setter和getter的改进写法
每次要为一个属性写上getter
和setter
,不得不手十分麻烦,所以有了更简单的写法,
在.h
文件里,直接这样写,表示声明了一个实例属性和它的getter
和setter
器
@property int age;
然后在.m
文件中这样写,表示实现setteer
和getter
@synthesize age;
这样,就可以和以前一样调用getter
和setter
了。
四、setter和getter的改进优化
可以看到,getter
器的方法名直接就是变量名,方法名和变量名一样,容易让人迷糊,所以,可以这样优化。
在.h
文件中依然这样声明
@property int age;
在.m
文件中,这样去写,
@synthesize age=_age; //加上一个_
//这么,我们就可以去使用_age 和使用age一样
-(void)show
{
NSLog(@"%i",_age);
}
五、@property
的属性
可以使用属性来规定@property
,设定的方式如下:
@property (attribute1[,attrubute2,...])
举个例子:
@property (nonatomic,strong) Engine* engine;
如果你在@property
设置了属性,如果你使用@synthesize
,那么它会自动帮你完成这些属性的实现,如果你是自己手动的去完成实现的话,那么,你必须自己写出这些属性的实现。
(1)、设置访问方法的名字
默认的getter
和setter
器的名称是和变量名关联的,一定是setVirableName
和virableName
,比如上面的变量age
,setter
是setAge
,getter
是age
。
可以通过设置@property
中的setter
和getter
属性来修改setter
和getter
器的方法名。
getter=getterName
setter=setterName
举个例子:
@property (getter=show1,setter=show2:)int age;//现在,它的getter和setter的方法名字就变了
注意:如果你设置了readonly
属性的话,那么你就不应该设置setter
属性,要不然会给出一个编译器的警告。
(2)、设置只读或读写
下面两个属性很好理解,
readwrite
:表示既有getter
,也有setter
readonly
:表示只有getter
,没有setter
这两个属性是互相排斥的,只能存在一个。
(4)、访问属性的线程安全
nonatomic
:表示不考虑线程安全