您的位置:首页 > 运维架构

OC属性_property

2015-12-08 22:20 99 查看


property
声明属性,就相当于声明了getter和setter方法
 
声明方式:
@property(①,②,③,④)数据类型 属性名称
 
习惯的写法(其实顺序是无关重要的)
①操作类型
atomic:原子操作,用于多线程的(默认),线程保护的。性能低(一般开发OC中的APP不推荐使用,做金融等高安全的时候使用)
nonatomic
:非原子操作,运行速度快,线程不保护,性能高,推荐使用
 
atomic原子操作:就是一个操作执行过程不能被中断,要不执行完,要不就不执行(一个操作不可以中途CPU暂停然后调度)。如果一个操作是原子性的,那么在多线程环境下,就不会出现变量被修改等奇怪的问题(保证数据同步)。原子操作就是不可再分的操作,在多线程中原子操作是一个非常重要的概念,常用来实现一些同步机制,同时也是多线程bug的源头
 
nonatomic非原子操作:操作是直接从内存中取数值(不考虑是否被占用),因为它是从内存中取得数据的,并没有一个加锁的保护来用于CPU中的寄存器计算Value,只是单纯的从内存地址中,当前的内存存储的数据结果来进行使用。在多线程环境下课提高性能,但无法保证数据同步
 
 
②引用方式(用于set方法内存管理(ARC模式下))
assign:(默认)生成直接赋值的set方法(不考虑内存管理),适用于非OC对象(就是基本数据类型、复合数据类型)
copy:拷贝对象。生成符合内存管理的set方法(release旧值,copy新值),适用于NSString、NSArray等不可变对象
strong:强引用,决定了对象的存亡(一个对象如果没有强指针指向(引用计数器为0)时,对象将被销毁,释放内存),其指向一个对象,相当于该对象做一次retain操作。适用于OC对象
retain:保留对象,内部会自动调用retain方法,引用计数加1。生成符合内存管理的set方法(release旧值,retain新值),适用于OC对象的成员变量
weak:弱引用,其存在与否无所谓(弱指针指向对象与否(对象引用计数器不变)),适用于OC对象
unsafe_unretained :与weak类似,但它是unsafe,因为使用不但就会产生野指针,导致程序crach
autoreleasing:可以使对象延迟释放
非ARC下的retain,相当于ARC中的strong,弱引用相当于assign
使用copy参数与使用retain参数产生的set方法一样(将生成的set方法中的retain改为copy也可以)
 

 
③读取方式
readonly:只允许读取,只生成get方法的声明与实现(不生成set方法的声明与实现)
readwrite:允许读写(默认),同时生成set、get方法的声明与实现
 
 
④方法名重命名(常用于BOOL类型的成员变量的get方法,BOOL方法常以is开头(set方法很少用))
getter = 重命名
setter = 重命名
 
setter:给成员变量的set方法重命名,set方法默认命名:
- (void) set成员变量名(成员变量名首字母大写):(成员变量数据类型) 成员变量名
getter:给成员变量的get方法重命名,get方法默认命名:
- (成员变量数据类型) 成员变量名
 

 
属性点语法的调用:
使用点语法来对属性进行调用,实际就是调用setter和getter方法,所以就可以用常用的调用方法的方式来调用,就是使用“[ ]”来进行调用

点语法扩展:就是所有的方法都可以使用点语法来进行调用,但是会有警告,但是不影响运行
 
 
属性的实现(写在.m文件中,一般是第一行)
@synthesize 属性名 (属性名可以是多个)
在.m文件声明后,就不用在属性名前加”_”来进行标识
这是默认的模式,就是系统默认声明和实现setter和getter方法
 

@dynamic 属性名
这是动态实现getter和setter方法,就是把getter方法和setter方法交给开发者动态实现。
 
 

所谓动态,与OC语言的机制有关,OC语言是运行时语言,就是一切都是运行时才确定的。譬如使用id来创建一个对象,由于id是万能指针,也就是可以指向任何类型数据,因此,在运行前,根本无法确定id所指向的数据类型,只有在运行时才能确定id所指向的数据类型,这个是OC语言的特点。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC_property