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

@property里能写的东西有什么用

2016-01-20 15:37 330 查看
首先,property是一种代码生成机制,能够生成不同类型的getter/setter方法。1.readonly/readwrite(默认)只生成getter,称为只读属性2.assign/retain/copy这三个关键字是在属性对设置器方法里限定和内存管理有关的东西。assign称为标记,意思是不去改变引用计数,在属性为基础数据类型时使用;retain称为持有,也就是说一个指针变量指向对象,并使该对象的引用计数+1;copy是拷贝,即重新开辟一块内存空间存储对象,这个对象跟上下文的对象无关,他们有不同的内存地址。3.nonatomic/atomic(默认)非原子性和原子性,非原子性访问,不加同步和多线程并发访问,原子性则相反。那么非原子性为什么会提高性能,在这里,我们先做个测试
Person *person = [[Person alloc] init];

uint64_t begin =  mach_absolute_time();//#import <mach/mach_time.h>
self.p1 = person;
uint64_t end =  mach_absolute_time();//#import <mach/mach_time.h>
NSLog(@"end - begin = %llu",end-begin);
上面的代码在
@property(nonatomic,retain)Person *p1;
@property(atomic,retain)Person *p1;
的运行结果分别是971和2464,从这个测试可以看出,性能上的确有很大提升,那么为什么呢?这是因为在iOS中使用同步锁的开销比较大。第二个方面是多线程安全,在逻辑上,当程序在一个线程里对一个对象多次读取数值,而在另外一个线程里,程序对该多想修改数值,如果恰巧又是在不加锁到情况下,那么数值就会很混乱,读取到的数值可能会不对。因此苹果特地写好了atomic机制,atomic就是OC的一种线程保护技术,但是权衡性能的追求,在iphone上如果没有使用多线程间的通讯编程,那么就规定使用nonatomic。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: