2017-11-06 - 草稿
iOS属性修饰符
作为一个iOS入手新员,对iOS很多方面都是一知半解,最近看了一下iOS关于熟悉性修饰符的相关知识,做了总结一下。给自己以后翻阅做做笔记,也希望能帮到一起学习的朋友。
iOS的属性修饰符:assign,retain,copy,strong,weak,nonatomic,atomic,readwrite,readonly等。
assign: 在IOS 中assign是最容易理解的一个属性,它是直接赋值,不对对象做其他修改,一般用于基础数据的修饰,索引数不增加。
copy:建立一个索引计数为1的对象,然后释放旧对象,这里又有深拷贝和浅拷贝之分
深拷贝是内容复制,另开辟一段内存空间,然后新建对象,将旧对象的值复制给新建的对象。两者之间指向内存不同,互不干涉。
浅拷贝就简单多了,它是增加一个指向对象的内存地址的指针,两者共用一个内存,它是对象的索引计数+1,一旦计数减为0 ,被释放,那么两者都不能在使用。否则会出错
retain与浅拷贝copy修饰是一样的,它仅对计数做出一个+1的操作,指向的内存不变。
strong 是强引用,被strong修饰的对象只要引用它的对象还存在,那么他就不会被销毁,知道父控件的生命周期结束。使用strong会涉及到一个内存泄漏的问题,如果与A和B连个对象相互持有,且都是强引用那么,两个对象将无法释放造成内存泄漏解决方法是把其中一个对象改为用weak修饰。
weak 是弱引用,与strong相对,若是说strong是占有,那么weak只能算是,被weak修饰的对象自己管理自己的生命周期,当不需要的时候回立即释放掉。使用xib和storyboardka开发一般默认都是用weak修饰,因为加载控件调用addSubview时方法默认是使用strong修饰,如果xib和storyboardy也默认strong那么将有两条强引用指向控件
nonatomic和atomic
在定义 property 的时候,不写默认是atomic。
atomic是原子性,一般情况下不会特意去考虑他,atomic和nonatomic只有在考虑多线程的时候才会有分别。这两个属性主要的分别是在 getter/setter 方法设置,nonatomic在 getter/setter 方法中会对操作加锁,保证在多线程中当前操作不会被影响,只有执行完才会开始下一步操作,且会度也能用技术做+1操作,保证对象存在,不会出现在运行中被relase掉的情况。
nonatomic是非原子性,他只保证 getter/setter的线程安全,并不保证整个对象的线程安全。所以在多线程中可能会出现设置获取值与预想不一致,甚至出现在运行过程中释放掉对象而出现野指针错误。(编码中若是有使用到多线程一定要考虑使用atomic属性)
可读性: readonly、readwrite
readonly 仅读 ,使用这个修饰符修饰,那么这个属性只生成getter方法,保证属性不被类外改变
readwrite可读可写,同时生成getter/setter方法,在不写的情况下这个属性是默认的。
来自一个新手总结,方便自己查阅,也希望对一些刚入门的朋友有所帮助,如果又发现有什么错误希望各位前辈指出。