OC-内存管理

==========================

内存管理

==========================

【问】内存管理到底做了件什么事?

oc中内存是如何创建和如何释放。

oc内存管理

【手动内存管理MRC】

Xcode5之前都是手动内存管理

【问】现在都是Xcode7,为什么还要学习手动管理内存?

【答】目前阶段,手动管理内存的项目仍然存在

arc转mrc:工程—>targets—>build Settings—>搜索:gar;把yes—>no

【c语言中内存管理的麻烦】

1.创建的内存之后没有释放,这种情况称为【内存泄露】

2.多次释放了同一块内存,这种情况称为【重复释放】【多次释放】

3.在线程中对内存管理非常不方便,存在多次引用释放导致程序崩溃。

4.c语言模块化编程,出现野指针。

【oc中内存管理方式】引用计数器

1.引用计数器可以理解为指针计数器,对一个对象引用了1次,堆空间计数器+1,释放了一次引用计数器,计数器-1,当计数器为0,对象内存释放;

【oc中内存管理】

1.严谨对一个堆空间进行多次释放(release)。【重复释放】—【崩溃】

2.严谨对一个堆空间创建内存后,不去释放。【内存泄露】—【内存只增不减】

【总】oc中内存管理,谁创建,谁释放,哪个类创建,哪个类负责释放,哪个类alloc ,哪个类release;

【总】【mrc】oc中像 alloc、retain、copy、mutablecopy(或者是以mutablecopy、copy开头的系统方法)、new,这些都需要release/autorelase;

retain 引用计数器+1,还是当前内存对象;

copy 复制出来一个新的内存空间(mutablestring),不可以修改

mutablecopy 复制出来一个新的内存空间(mutablestring),可修改

【注】

栈:对操作系统来说,函数的参数或者方法中的局部变量都在栈空间。

堆:对操作系统来说,由程序员负责分配创建或者释放内存,这些内存空间都在堆空间

【相关方法】

1.如果在构造函数中alloc内存,需要在析构函数(delloc)函数中对内存进行释放。

2.如果发生了成员变量指针的转移,需要先retain;

3.从数据结构中取值,如果想长保留,需要retain;

【MRC中的自动内存管理】

1.自动释放池可以理解为延迟释放(自动释放);

2.autorelease方法是可自动释放池搭配使用的,缺少了自动释放池,autorelease也就没效果了;

【自动释放用处】

1.一般用在局部方法中;

2.用在非用不可的情况;

3.mrc中,需要return的alloc对象,可以通过添加autorelease方法,交给系统去自动释放内存

【属性变量修饰符】

1.copy

2.retain

【补充】

1.一般情况下,方法中的堆空间,释放的时候尽量在方法的底部写release;避免出现提前释放的问题。

2.mrc工程从严格意义上说,性能优于arc工程;但是从使用层面上说,arc性能优于mrc;从编码程度上来说,arc比mrc的工作量更小;从安全角度上说,arc优于mrc;【手机性能过剩】

【如何检测内存泄露】product—>Analyze;这个就会分析出工程中存在问题的代码

【自动内存管理ARC】

Xcode5之后都是自动管理内存

【mrc转arc】Edit—>convert—>To Object-C ARC …

【注】此操作不可逆

【arc工程中使用Mrc】工程—>Targets—>Build Phases,选中先关的类.m文件,双击输入-fno-objc-arc;这样就把相关.m文件设为了mrc管理的文件

【自动管理内存的弊端】

1.自动管理内存某一些代码仍需要手动管理,并不是说要手动release,arc中属性变量对用retain、strong、weak没有一个严格的要求;但是在arc和非arc混编会有要求。

原文地址:https://www.cnblogs.com/GJ-ios/p/5304585.html