OC属性总结
<prename="code"class="cpp">setter方法的作用:为单一的变量赋值.
setter方法规范写法:1.-号方法,无返回值.
名字以set开头+要设置的变量的实例变量名(首字母要大写):(setter方法有且只有一个参数)+参数的类型(和实例变量类型相同)+参数名(和实例变量名相同)
getter方法的作用:获取单一的实例变量的值.
getter方法的命名规范:-号方法,有返回值(返回值类型和实例变量类型相同)方法名直接和实例变量名相同.无参数.</span>
属性
[objc]viewplaincopyprint?
属性是OC2.0之后出来的新的语法,用来替代
setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现.另外还添加了对实例变量操作的安全处理
@property用来定义属性
NSString*属性的类型(和实例变量类型相同)
name属性名(和实例变量名相同)
切记:@property只是自动声明setter以及getter方法的声明
属性的定义:
属性的声明:使用@property声明属性例如:(@propertyNSString*name;)
[objc]viewplaincopyprint?
相当于@interface中声明了两个方法:
-(void)setName:(NSString*)name;
-(NSString*)name;
[objc]viewplaincopyprint?
属性的实现:使用@synthesize实现属性(例如:@synthesizename=_name)
[objc]viewplaincopyprint?
相当于@implementation实现了
-(void)setName:(NSString*)name;
-(NSString*)name;
@synthesizename=_name;
[objc]viewplaincopyprint?
注释:
@synthesize属性的实现部分,实现属性自动生成的setter以及getter方法.
name属性名,指定要实现哪一个属性生成的setter以及getter方法
_name,指定setter和getter方法内部所要操作的实例变量
如果指定的实例变量没有定义,系统会自动生成指定的实例变量,但是生成的实例变量是私有的,子类不能直接访问
如果实例变量想让子类访问,那在.h文件必须定义实例变量.
如果未指定setter和getter内部所要访问的实例变量时,系统自动生成一个和属性名一样的实例变量例如:@synthesizename,gender,age,height,weight;
如果对于setter和getter方法,如果我们实现了,系统就不会再自动生成了
如果在.m文件中未通过@synthesize对属性进行合成,系统会自动合成,只不过此时系统默认的setter和getter方法内部所操作的实例变量是_属性名
如果将@synthesize省略,并且我们自己实现setter以及getter方法时,系统就不会生成对应setter以及getter,还有实例变量
属性的特性(attribute)
第一大特性:读写特性
(1)readonly:告诉编译器,属性在自动生成方法时,只会生成getter方法,不会生成setter方法.
(2)readwrite:告诉编译器,属性在自动生成方法时,既要生成setter方法,也要生成getter方法.系统默认的读写特性
(3)setter=aa:告诉编译器,当自动生成setter方法时,setter方法的方法名为指定的名字aa,不采用默认的.
(4)getter=bb:告诉编译器,当自动生成getter方法时,getter方法的方法名为指定的名字bb,不采用默认的.
第二大特性:原子性特性
(1)atomic:原子特性,保证线程安全,内部做了安全性访问理(加锁与解锁).系统默认的原子特性
(2)nonatomic:非原子性,不保证线程安全
因为对于setter以及getter方法的使用,比较频繁,在一段时间内可能要多次访问,所以使用atomic会非常消耗系统的资源,降低程序的执行效率,使用nonatomic虽然不保证线程的安全,但是使用一般情况下都是安全的,所以对于原子特性,使用nonatomic.
第三大特性:语义特性
(1)assign:直接赋值,使用针对于基本数据类型(intfloat).也可针对于对象类型.系统默认的语义特性.
(2)copy:针对于对象类型并且要服从NSCopying协议的对象才可以.会复制出一个新的对象,拥有新的对象的所有权.(引用计数+1).(先暂时这么理解)
(3)retain:针对于对象类型,会造成对象的引用计数+1
[objc]viewplaincopyprint?
1.当把语义特性声明为assign时,setter以及getter方法内部实现
-(void)setName:(NSString*)name
{
_name=name;
}
-(NSString*)name
{
return_name;
}
2.当把语义特性声明为retain时,setter以及getter方法内部实现
-(void)setName:(NSString*)name
{
if(_name!=name){
[_namerelease];
_name=[nameretain];
}
}
-(NSString*)name
{
return[[_nameretain]autorelease];
}
3.当把语义特性声明为copy时,setter以及getter方法内部实现
-(void)setName:(NSString*)name
{
if(_name!=name){
[_namerelease];
_name=[namecopy];
}
}
-(NSString*)name
{
return[[_nameretain]autorelease];
}
点语法
点语法,是一种快速访问setter以及getter方法的方式.声明属性默认生成对应的setter以及getter方法.所以属性和setter和getter方法都有关联
对象.属性名---如果在等号的左边,意味着调用setter方法,除此情况,都是调用getter方法
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。