iOS 的内存管理(ARC)简单概念与原理

内存管理的方式:

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是因为?快速有效性);

copy:

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基本上是很安全的,内存泄漏不太存在,但也是存在的,关于内存泄漏的请看下一不大神写的 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,109评论 1 16
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,838评论 8 119
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,633评论 0 6
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,744评论 0 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,728评论 30 472

友情链接更多精彩内容