==========================
内存管理
==========================
【问】内存管理到底做了件什么事?
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混编会有要求。