Objective-C:nonatomic关键字(修饰变量,可以提高访问速率)
来源:互联网 发布:买家怎么修改淘宝评价 编辑:程序博客网 时间:2024/05/22 19:46
为了防止同一变量被不同的线程在某一时间段同时访问,必须加原子琐来保证某次操作的正确性。关于操作的原子性,我看过大神guancheng的一篇http://www.parallellabs.com/2011/04/09/pthread-mutex-lock-and-thread-safety/,这篇文简单的介绍下原子操作。
给线程加锁的消耗是比较大的,而我们在IOS中不是经常会多个线程访问一个同一个变量,为了提高效率,我们通常会在属性中这样声明:
@property (nonatomic,copy)NSString *userName;
有同学可能非常疑惑,这样做到底能提高多少效率呢?不这样做又怎样?好,下面我们来写个Demo。
1.首先我使用上面的声明的userName的声明
- @property (nonatomic,copy)NSString *userName;
- - (void)viewDidLoad
- {
- uint64_t begin = mach_absolute_time();
- self.userName = @"username";
- uint64_t end = mach_absolute_time();
- NSLog(@"end - begin = %llu",end-begin);
- }
运行下结果是:
2012-07-12 19:57:59.679 NavigationDemo[635:f803] end - begin= 1236
2.然后我使用下面的声明- @property (atomic,copy)NSString *userName;
- - (void)viewDidLoad
- {
- uint64_t begin = mach_absolute_time();
- self.userName = @"username";
- uint64_t end = mach_absolute_time();
- NSLog(@"end - begin = %llu",end-begin);
- }
运行的结果是:
NavigationDemo[726:f803] end - begin = 8330
3.可以明显看出声明为nonatomic能提高好几倍的效率,所以在属性声明的时候,当不会在多线程下操作此成员的时候声明为非原子性能极大的提高效率,希望看完这篇文后更多的同学能使用这个声明。
转自:http://blog.csdn.net/cubepeng/article/details/7735962
0 0
- Objective-C:nonatomic关键字(修饰变量,可以提高访问速率)
- Objective-C学习笔记(二十四)——成员变量的访问修饰符学习
- Objective-C 属性关键字(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
- Objective C - nonatomic & atomic:
- C语言修饰变量的关键字
- Objective-C中属性修饰符copy,retain,assign,readonly,readwrite,nonatomic
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
- 关于Java Final 修饰的局部变量,多线程可以访问
- Final关键字(修饰变量)
- const关键字修饰变量
- Objective-C语言--实例变量作用域修饰符
- Objective-C知识整理——实例变量修饰符
- Objective-c的成员变量访问权限
- Objective-c - 在block内部访问变量
- final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口
- final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口
- final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口
- final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口
- LR-LR运行Java Vuser(JAVA环境配置)
- IOS类库
- 补码的原理
- MyEclipse中SVN用户名密码的切换
- Struts2工作原理
- Objective-C:nonatomic关键字(修饰变量,可以提高访问速率)
- vc2010 编译 qrencode
- SQL获取上个月第一天和最后一天的时间写法
- 在MVC4中采用UEditer(百度编辑器)脚本。报错,显示从客户端(<p>2323</p>)中检测到有潜在危险的Request.Form 值的处理办法
- 辛星浅析Linux中的进程基本知识以及fork的简单理解
- c# params
- 深入浅出之C# 串行化与反串行化
- wind7 安装Oracle客户端和pl/sql developer 无法成功连接数据库
- 微信支付之get_brand_wcpay_request:fail_invalid appid