一.setter和getter的一般写法
setter
和getter
器可以说是一个类最基本的东西,任何一门面向对象的语言,都又这个概念,C++
、Java等等。因为setter
和getter
是对面向对象语言封装的最基本的支持。
在Objective-C
的setter
和getter
器,当然也和一般的语言没有什么不同。只不过,添加了一些自己的特性。
比如有一个实例变量:int age
;
先在.h
文件中声明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
这两个属性是互相排斥的,只能存在一个。
(3)、定义setter
的语义
下面的属性指定setter
语义设置访问器。他们是互相排斥的。
strong
:指定有很强的(拥有)关系到目标对象。
weak
:指定有弱(non-owning)
关系到目标对象。如果目的地对象销毁,属性值将自动设置为nil。(弱属性不支持OS X上的v10.6和iOS4 ,使用指定取而代之)。
copy
:调用原始对象的copy()
方法,创建一个原始对象的副本,用于分配给新的引用。原始的对象在调用release
方法。当然这个属性只用于实现了NSCopying
协议的对象类型。
assign
:指定使用简单的赋值的setter
。这个属性是违约。 使用这个属性对于标量的类型(如NSInteger
和CGRect
等);
retain
: 指定retain
应该调用对象上的。原始的对象在调用release
。在OS X v10.6和之后,您可以使用这个关键字用于内存管理方面。
(4)、访问属性的线程安全
nonatomic
:表示不考虑线程安全
网友评论