内存管理的方式:
1.MRC(Manual Reference
Count)人工引用计数:内存的开辟和释放由程序代码进行控制(程序员要熟悉内存管理的机制:引用计数)
2.ARC(Automatic Reference Count)自动引用计数(
不是自动管理内存)(编译器帮助程序员默认加了释放代码)(ARC是基于MRC的)
@注:
1.iOS支持MRC和ARC两种内存管理方式,OC采用计数机制管理内存,标记这块内存在被几个对象使用。
2.在C语言中使用malloc和free,经行堆内存的创建和释放。堆内存只用正在使用和销毁两个状态。两个以上的指针使用同一块内存,C语言无法记录内存使用者的个数
@影响引用计数的方法
+alloc
-retain
-copy
-release
-autorelease
(思考例子中最后count输出结果不是0是因为?快速有效性);
1.把某⼀一内存区域的内容拷⻉贝⼀一份,拷⻉贝到新的内存空间⾥里
去,被拷⻉贝区域的引⽤用技术不变,新的内存区域的引⽤用计数为1。
2.不是所有对象都可以接收copy消息,只能接受NSCopying协议的对象
3.深拷贝,拷贝的是指针和指针指向的对象,原来的对象不会发生任何变化,相当于克隆
4.浅拷贝,拷贝的的是指针,本身变化,其拷贝也发生变化,相当于人与自身影子的变化。
(面试题:1浅复制和深复制的区别?浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象----只赋值地址深层复制(mutableCopy):复制引用对象本身---再创建一个对象意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。//当修改A时,A copy不变。
@dealloc:是继承自父类的方法,当所有的引用计数都为0时,由对象自动调用。
内存管理要点:
Objective-C
使用引用计数机制(retainCount)来管理内存。内存每被引用一次,该内存的引用计数+1,每被释放一次引 用计数-1。当引用计数= 0 的时候,调用该对象的 dealloc 方法,来彻底从内存中删除该对象。
alloc,allocWithZone,new(带初始化)时:该对象引用计数 +1;
retain:手动为该对象引用计数 +1;
copy:对象引用计数 +1;
mutableCopy:生成一个新对象,新对象引用计数为 1;
release:手动为该对象引用计数 -1;
autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。来源:Amber
ARC基本上是很安全的,内存泄漏不太存在,但也是存在的,关于内存泄漏的请看下一不大神写的