Objective-C:nonatomic关键字(修饰变量,可以提高访问速率)

2024-01-21 10:18

本文主要是介绍Objective-C:nonatomic关键字(修饰变量,可以提高访问速率),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了防止同一变量被不同的线程在某一时间段同时访问,必须加原子琐来保证某次操作的正确性。关于操作的原子性,我看过大神guancheng的一篇http://www.parallellabs.com/2011/04/09/pthread-mutex-lock-and-thread-safety/,这篇文简单的介绍下原子操作。

       给线程加锁的消耗是比较大的,而我们在IOS中不是经常会多个线程访问一个同一个变量,为了提高效率,我们通常会在属性中这样声明:

@property (nonatomic,copy)NSString *userName;

     有同学可能非常疑惑,这样做到底能提高多少效率呢?不这样做又怎样?好,下面我们来写个Demo。

1.首先我使用上面的声明的userName的声明

[html]  view plain copy
  1. @property (nonatomic,copy)NSString *userName;  
  2. - (void)viewDidLoad  
  3. {  
  4.     uint64_t begin =  mach_absolute_time();  
  5.     self.userName = @"username";  
  6.     uint64_t end   = mach_absolute_time();  
  7.     NSLog(@"end - begin = %llu",end-begin);  
  8. }  

运行下结果是:

2012-07-12 19:57:59.679 NavigationDemo[635:f803] end - begin 1236

2.然后我使用下面的声明

[html]  view plain copy
  1. @property (atomic,copy)NSString *userName;  
  2. - (void)viewDidLoad  
  3. {  
  4.     uint64_t begin =  mach_absolute_time();  
  5.     self.userName = @"username";  
  6.     uint64_t end   = mach_absolute_time();  
  7.     NSLog(@"end - begin = %llu",end-begin);  
  8. }  

运行的结果是:

NavigationDemo[726:f803] end - begin  8330

3.可以明显看出声明为nonatomic能提高好几倍的效率,所以在属性声明的时候,当不会在多线程下操作此成员的时候声明为非原子性能极大的提高效率,希望看完这篇文后更多的同学能使用这个声明。



转自:http://blog.csdn.net/cubepeng/article/details/7735962

这篇关于Objective-C:nonatomic关键字(修饰变量,可以提高访问速率)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629198

相关文章

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例