OC存取器的指示符详解

来源:互联网 发布:java shiro盐值加密 编辑:程序博客网 时间:2024/05/02 02:19

一、存取器指示符

1、assign:该指示符指定对属性进行简单的赋值,不更改对所赋的值的引用计数,这个指示符主要用于NSInteger等基础类型,以及short、float、double、结构体等C数据类型;

2、atomic(nonatomic):指定合成的存取方法是否为原子操作,所谓原子操作,主要指是否线程安全,如果使用atomic,那么合成的存取方法都是线程安全的——当一个线程进入存取方法的方法体之后,其他线程就无法进入该存取方法,这样可以避免多线程并发破坏对象的数据完整性,atomic是默认值,虽然atomic可以保证数据的完整性,但是atomic的线程安全会造成性能下降,因此,大多数单线程环境下,我们会优先考虑使用nonatomic来提高存取方法的访问性能。

3、copy:使用copy指示符,如果调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将成员变量所引用对象的引用计数减1,当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置的成员变量值,此时就可以考虑使用copy指示符。

4、getter、setter:指示符用于为合成的getter方法和setter方法指定自定义的方法名。

5、readonly、readwrite:readonly指示系统只合成getter方法,readwrite是默认值,系统合成getter和setter方法

6、retain:使用retain指示符定义属性时,当把某个对象赋值给该属性时,该属性原来所引用的对象引用计数减1,被赋值对象的引用计数加1。在为弃用ARC机制下,retain是一个很有用的指示符,当一个对象的引用计数大于1时,该对象不应该被回收,但启用ARC机制后,一般较少使用retain。

7、strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指向被赋值的对象,那么该对象就不会自动回收,弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。weak指向的地址一旦被释放,这些指针都被赋值为nil,这样能有效的防止悬空指针。

8、unsafe_unretained:这个指示符与weak指示符基本相似,对于被unsafe_unretained指针所指向的对象,该对象也可能被回收,与weak指针不同的是,当unsafe_unretained指针锁引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,因此可导致程序崩溃。

二、键值编码KVC与键值监听KVO

ASPerson*    per = [[ASPerson alloc] init];

[per   setValue:@"XXX"   forKey:@"OOO"];

其中ASPerson为自定义类,OOO为存取器设置的属性名,XXX为属性名设置的属性值。

[per   valueForKey:@"OOO"],获取OOOkey的属性值。

KVC方式的搜索顺序为:1)setName方法、2)_name成员变量;3)name成员变量

使用KVC方式操作属性时,如果属性不存在getter和setter方法,也不存在对于的成员变量,KVC会自动调用setValue:forUndefinedKey:和valueForUndefined:方法——但系统默认实现这两个方法仅仅是引发异常,并没有进行任何特别的处理。并可能引发一个异常,结束程序,这个默认方法的实现允许并不合适我们的程序,所以,可以考虑重写setValue:forUndefinedKey:方法。如:

-(void) setValue:(id) value forUndefineKey:(id) key

{

NSLog(@"打印错误信息");

}

0 0
原创粉丝点击