属性是objective c 的一项特性,用于封装对象中的数据。实例一般通过“存取方法”来访问。什么是存取方法:getter 和setter 方法,其中getter 用于获取变量value, 而setter 用于写入value。在objective c 2.0中,可以通过“点语法” 来让编译器自动调用相关的存取方法。
例如:Student * student=[[Student alloc]init];
student.name="xxxxx";
nslog(@"%s",student.name);
编译器会把点语法转换成存取方法的调用。
那么点语法和手写get set 方法效果是一样的,点语法有什么优势呢?
1.省时,省力 :如果使用了属性,编译器会自动编写访问属性所需的方法。这个过程由编译器在编译期执行,看不到这些get set 源代码。
2.编译器会自动向类中添加适当类型的实例变量,并且在属性名前添加下划线。
如果不想让编译器自动合成存取方法,该如何做呢?
使用@dynamic 关键字
属性特质
1.原子性
默认情况下,编译器所合成的方法会通过锁定机制保证其原子性。如果属性具备nonatomic 特质,则不使用同步锁。如果某属性不具备nonatomic 特质, 那么就是原子的。
内存管理
1)assign :”设置方法“ 只会执行正对 “纯量类型” 如:CGFloat 和NSInteger 简单的操作
2)strong : 此特质表明该属性定义了一种“拥有关系” 。
3)weak :定义了一种非拥有关系, 该属性所指的对象遭到摧毁, 属性value 也会被清空。
4)unsafe_unretained: 和assign 相同,适用于对象类型,当目标对象遭到破坏时,属性vlaue 不会自动被清空。
atomic和nonatomic 的区别是什么?
具备atomic特质的获取方法会通过锁定机制来确保其操作的原子性。也就是说,如果两个线程读写同一属性,那么不论何时,总能看到有效的属性value, 如果不加锁的话,或者使用(nonatomic),那么当其中一个线程正在修改某属性时,另一个线程或许会突然闯入,把尚未修改好的属性读取出来。
但是如果ios 全部采用原子的话,在ios中会开销很大,会带来性能问题,而且使用原子并不能保证线程安全。例如,一个线程在连续多次读取某属性的过程中有别的线程在同时改写该值,即便申明为atomic,还是会读取到不同的属性
网友评论