readonly: 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

readwrite: 此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。

nonatomic: 非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。

atomic 和 nonatomic 用来决定编译器生成的 getter 和 setter 是否为原子操作。

1.atomic  设置成员变量的 @property 属性时,默认为 atomic,提供多线程安全。

在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:

    {lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}

2.nonatomic  禁止多线程,变量保护,提高性能。 
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。 
指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。

assign:  简单赋值,不更改索引计数

copy: 建立一个索引计数为1的对象,然后释放旧对象

retain: 释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

copy与retain:  copy其实是建立了一个相同的对象,而retain不是:  比如一个NSString对象,地址为0×1111,内容为@”STR” ,Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化, retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1 ,也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…

assign与retain:  copy其实是建立了一个相同的对象,而retain不是: 

1. 接触过C,那么假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。

2.了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。

总结:上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。

__nullable和__nonnull 
__nullable表示可以为nil 
__nonnull表示不可以为nil

最新文章

  1. linux 网卡问题 Device eth0 does not seem to be present,delaying initialization.
  2. STL 库中的陷阱----一个难以察觉的 bug
  3. cocos2dx 安卓编译问题收集
  4. mysql tinyint smallint mediumint int bigint
  5. Winform 窗口拖动
  6. JVM 虚拟化
  7. MySQL 5.7: Enhanced Multi-threaded slaves
  8. asp.net微信支付打通发货通知代码
  9. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电
  10. 不定义JQuery插件,不要说会JQuery[转载]
  11. spark install
  12. 64位sql server 如何使用链接服务器连接Access
  13. 以通配符(%)开始的like字符串,走索引
  14. python3使用ctypes在windows中访问C和C++动态链接库函数示例
  15. Spring Boot整合Elasticsearch
  16. Ubuntu16下Hadoop安装
  17. nginx和resin一二三
  18. webpack 模块方法
  19. codewars 题目笔记
  20. Java8新特性interface中的static方法和default方法

热门文章

  1. 规划行业GIS云平台“城智图”上线运行
  2. Android批量打包提速 - 1分钟900个市场不是梦
  3. Nested Prefab Mode 嵌套预制体 保存问题 Dirty
  4. 六位数随机验证 sms_code.py
  5. MYSQL数据类型 表基本操作 表记录增删改 单表查询
  6. Excel连接字符串在.NET中的应用
  7. hdfs操作手册
  8. 《SQL Server 2008从入门到精通》--20180704
  9. cent7中kickstart
  10. 使用Charles进行网络请求抓包解析