OC语言使用引用计数来管理内存,每一个对象都有一个能够递增和递减的计数器。若是有其余对象持用该对象的话,那该对象就递增其引用计数;用完之后就递减其计数,当引用计数为0时,就销毁该对象。程序员
Xcode4.2默认设定为对全部的文件ARC有效。ARC有效指的是编译器会在编译时,自动在代码中加上retain、release等语句管理内存。本质上与MRC是同一套内存管理逻辑,只是开启ARC后,由编译器帮咱们管理内存而已。编程
ARC有效时,id类型和任何对象类型(对象类型就是指向NSObject这样的Objective-C类的指针)都必须附加全部权修饰符,全部权修饰符一共有四种:安全
属性声明的属性 | 全部权修饰符 |
---|---|
assign | __unsafe_unretained修饰符 |
copy | __strong修饰符(可是赋值的是被复制的对象) |
retain | __strong修饰符 |
strong | __strong修饰符 |
unsafe_unretained | __unsafe_unretained修饰符 |
weak | __weak修饰符 |
strong相似于retain,会将对象的引用计数器+1,分配内存地址。
weak相似于指针,只是单纯的指向某个地址,可是自己并未分配内存地址。当指向的地址被销毁时,该指针会自动nil。数据结构
assign 可修饰对象,和基本数据类型。当须要修饰对象类型时,MRC时代使用unsafe_unretained。固然,unsafe_unretained也可能产生野指针,因此它名字是"unsafe_”。多线程
assign 若是修饰对象,会产生野指针问题;若是修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。函数
weak的实现是基于哈希表,对象中的属性被weak修饰时,会以对象的地址为key,属性的地址为value,存储到哈希表中。当对象被销毁时,运行时会经过哈希表找到全部用weak修饰的属性,将其指针自动置为nil。学习
浅拷贝
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,当内存销毁的时候,指向这片内存的几个指针须要从新定义才可使用,要否则会成为野指针。线程
深拷贝
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束以后,两个对象虽然存的值是相同的,可是内存地址不同,两个对象也互不影响,互不干涉。指针
这里贴一个网友的总结
code
因为文中不少知识均来自于书籍
Objective-C高级编程 iOS与OS X多线程和内存管理
因此这篇文章只能算是一篇学习笔记,由于本人能力有限,若有错误,请直接留言指出。
实在是能力有限写不出比较有价值的东西,只好把网友写好的文章学习总结了一下,而后直接贴出来。原本都很差意思发表出来,但碍于本身夸下了海口说最近6个月每周一篇文章,因此这篇文章就勉强发了出来。后面仍是要继续努力,不只要坚持写博客,还要写出一些有意义有价值的东西来。