iOS 声明属性关键字讲解

atomic:

原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操作)在objective-c 属性设置里面 默认的就是atomic ,意思就是 setter /getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于 函数头尾加了锁 . 这样的话 并发访问性能会比较低 .

nonatomic:

非原子操作 一般不需要多线程支持的时候就用它,这样在 并发访问的时候效率会比较高 . 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作. 如果在程序中 我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步.

在头文件中声明属性的时候使用atomic 和 nonatomic等价于在头文件里面添加2个函数一个是用于设置这个属性的,一个是用于读取这个属性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;

atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意义.

@synthesize

如果没有实现setter和getter方法,编译器将会自动在生产setter和getter方法。

@dynamic

表示变量对应的属性访问器方法 , 是动态实 现的 , 你需要在 NSObject 中继承而来的+(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 动态实现的方法或者函数。

属性修饰其他关键字:

getter=getterName

指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数

setter=setterName

指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值)

当声明为 readonly 的时候,不能指定 set 方法

readwrite

如果没有声明成 readonly ,那就 默认是 readwrite 。可以用来赋值,也可以被赋值

readonly

不可以被赋值

assign

所有属性都 默认 assign ,通常用于标量(简单变量 int , float , CGRect 等)

一种典型情况是用在对对象没有所有权的时候,通常是 delegate ,避免造成死循环(如果用 retain 的话会死循环)

retain

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。

copy

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。且属性必须实现 NSCopying 协议

一般常用于 NSString 类型

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【记忆卡片】Linux sed命令

sed 在脚本使用时作用非常大,能完成很多更改功能,谁用谁知道 功能说明:利用script来处理文本文件。 语 法:sed [-hnV][-e<script>...

385130
来自专栏Java学习网

Java类加载机制的七个阶段,加载、验证、准备、解析、初始化、使用、卸载

当我们的Java代码编译完成后,会生成对应的 class 文件。接着我们运行java Demo命令的时候,我们其实是启动了JVM 虚拟机执行 class 字节码...

1.3K30
来自专栏闪电gogogo的专栏

Python初学——多进程Multiprocessing

1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务。 可把任务平均分配给每个核,而每个核具有自己的运算空间。 1.2 添加进程 P...

41880
来自专栏视觉求索无尽也

【Python】Python知识点总结

字典{key:value,key:value},dict(key=value,key=value):

50210
来自专栏公众号_薛勤的博客

深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

周志明的《深入理解Java虚拟机》很好很强大,阅读起来颇有点费劲,尤其是当你跟随作者的思路一直探究下去,开始会让你弄不清方向,难免有些你说的啥子的感觉。但知识不...

16820
来自专栏爱撒谎的男孩

多线程的使用

17850
来自专栏测试开发架构之路

堆和栈的区别

一、预备知识—程序的内存分配          一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放,存...

29380
来自专栏java一日一条

Java虚拟机体系结构,你知道吗?

众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操...

8820
来自专栏精讲JAVA

OutOfMemoryError异常系列之方法区溢出和运行时常量溢出池溢出

按照虚拟机的内存分配,运行时常量池属于方法区,所以今天在这一起讲了,大家都知道1.7的虚拟机规范出来以后,有个很重要的一点就是去永久代。今天我们...

257100
来自专栏JAVA高级架构

Java内存区域与虚拟机类加载机制

一、Java运行时数据区域 ? 1、程序计数器   “线程私有”的内存,是一个较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。Java虚拟机规范...

36580

扫码关注云+社区

领取腾讯云代金券