内存管理,readwrite,readonly,assign,retain,copy,nonatomic,的作用以及深浅拷贝
2015-11-20 00:34
411 查看
1.内存管理机制
当一个实例alloc以后,其引用计数器自动+1,在它引用到其他对象,或者超出作用域的时候,会自动减去1,此情况为ARC的情况,若MRC,需要手动retain和release,或者创建自动释放池来进行内存管理.
2.readwrite,readonly,assign,retain,copy,nonatomic的区别
readwrite:可读可写,默认属性,系统会生成setter和getter方法
readonly:可读,不可写,系统指挥生成getter方法,只可读取,不可赋值改动
assign:仅用在设置变量,是赋值特性,不进行retain操作,一般数据类型用它
retain: 计数器会+1,指针改变后,setter方法会relase对象然后retain新对象,新对象计数器+1,
copy:和retain类似,但是有区别,例如申明一个copy类型的对象A,初始A=B,实际上A产生了一个新的对象,计数器为1,具体见下文copy和retain的区别
nonatomic:非原子性访问,不加同步,多线程的时候可以提高性能,个人理解为因为非原子性,所以系统不用做额外的工作来保证线程安全,所以性能会高.如果是原子性, 所以不加nonatomic 线程则会相对安全.
3.copy和retain的区别
retain在IOS中常用,它只会进行引用计数器加1,后期操作对应release即可,arc则一般不用管计数器的操作,而copy则会创建一个新的对象的指针,会重新产生copy出来对象的引用计数器值.新的对象遵守协议后,在- (id)copyWithZone:(NSZone *)zone方法里,所有属性都相同.简单来说,model2对象copy了model1对象以后,各自本身的引用计数器是分开的,但是各自的属性却是指向相同指针,公用着引用计数器.或许有人会问,那么如果model1对象销毁后,model2还在,那岂不是model1的属性也还在?(model1都没了,它的属性还能在?你tm逗我呢?)
没错!确实就是还在,model2还用着!你model1确实是销毁了,但是它的属性销毁不销毁和它本身没有任何关系,而是和它属性的引用计数器有关系,说白了,因为model2的存在,mode1的属性的计数器在model1销毁的时候,还是不为0的.
从理论上讲例如:moedel2是copy的model1得来,model1销毁之前,你用一个变量接收过一次这个属性(其实你也可以理解为接受的是model2的这个属性),那么,在model1销毁后,你会发现,这个变量是有内存的,说白了,就是model2在用着.
属性为copy的属性,一般需要遵守协议并重写- (id)copyWithZone:(NSZone *)zone
4.深浅复制的区别:潜复制只复制指向对象的指针,而不复制对象本身,深复制则引用对象本身,简单来说,浅复制会根据对象的改变而改变,而深复制则完全重新分配了空间和指针,是两个独立的个体,只是刚开始的时候值相同
相关文章推荐
- URAL 1354 Palindrome. Again Palindrome (回文 + KMP)
- 适用于珠宝行业企业的TurboMail邮件系统
- programming-challenges Hanoi Tower Troubles Again! (110908) 题解
- UVa 12123 - Magnetic Train Tracks
- How can i get access to a Highcharts chart through a DOM-Container
- LeetCode:Factorial Trailing Zeroes
- TIME_WAIT状态(2MSL)的作用
- Container Water | LeetCode
- 【leetcode】Contains Duplicate
- PAT-PAT (Advanced Level) Practise Highest Price in Supply Chain(25) 【三星级】
- 【Linux学习笔记】栈与函数调用惯例 http://blog.csdn.net/xiaogugood/article/details/38490663
- Linux内核地址映射模型 http://blog.csdn.net/f22jay/article/details/7925531
- 编译遇到“__stack_chk_fail_local”错误
- [__NSCFString containsString:]: unrecognized selector sent to instance 的解决方案
- 人工智能中的具体搜索方法
- HOJ Train Problem II
- 栈区,堆区,全局区:内存结构图 http://blog.csdn.net/xlf13872135090/article/details/8828704
- 多线程 - 你知道线程栈吗 http://blog.csdn.net/gykimo/article/details/9132157
- 进程线程及堆栈关系的总结 http://blog.csdn.net/echoisland/article/details/6403763
- Daily Scrum - 11/19