博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC中如何对内存进行管理的
阅读量:5943 次
发布时间:2019-06-19

本文共 1089 字,大约阅读时间需要 3 分钟。

OC中的内存管理主要由三种方式ARC(自动内存计数),手动内存计数,内存池;

1)ARC:这种方式和java类似,在你的程序的执行中,始终有一个高人在你背后准确的帮你收拾垃圾,你不用考虑它什么时候开始工作,怎么样工作,你只需明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就会彻底把它忘掉了,反正那个高人会帮我们收拾垃圾的,但遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品,所以iPhone不支持这个功能。

  解决:通过alloc-inital方式创建的,创建后引用计数器+1,此后每retain一次引用计数器+1,那么在程序中做相应的次数release就好了。

2)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存被使用的次数,我们暂时把它称为计数器。当计数器变为0的时候,那么就是释放这段内存的时候,比如说,在程序A中一段内存被成功申请完成之后,那么这个计数器就从0变为1(我们称为这个过程为alloc),然后程序B也需要这个内存,那么计数器就从1变为2(我们把这个过程叫做retain)紧接着程序A不再需要这个内存了,那么这个计数器就会减1(我们叫这个过程为release),程序B也不需要这个内存的时候,那么也把计数器减去1(这个过程也叫release)当系统(也就是Foundation)发现这个计数器成员变为0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手动完成。

  解决:一般由类的静态方法创建的,函数名中不会出现alloc或init字样,如[NSString string]和[NSArray arrayWithObject:],创建后引用计数+0;在函数出栈后释放,即相当于一个栈上的局部变量,当然也可以通过retain延长对象的生存期。

3)内存池:可以通过创建和释放内存池控制内存申请和回收的时机。

  解决:是由autorelease计入系统内存池,内存池是可以嵌套的,每个内存池都需要有一个创建释放对象,就像main函数中写的一样,使用也很简单,如果[[[NSString alloc]initwithFormant:@"Hey you!"] autorelease],即将一个NSString对象加入到最内层的系统内存池,当我们释放这个内存池时,其中的对象都会被释放。

转载于:https://www.cnblogs.com/hunyifei/p/4899799.html

你可能感兴趣的文章
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
<气场>读书笔记
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
autoconf,automake,libtool
查看>>
jQuery的技巧01
查看>>
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>