2015.12.21 内存管理(memory management)
Memory Management
1.什么是内存管理?
程序在运行过程中管理内存分配的过程,当需要内存的时候就申请一片内存空间,不需要就释放掉。
2.如何去管理内存
站在分配对象拥有权的角度来操作内存。
3.内存管理的两种办法
a. MRR(Manual Retain Release)手动管理,实现的机制:reference counting(引用计数机制)。
b. ARC(Auto Reference Counting)自动引用计数,实现机制:系统在程序编译阶段自动添加了释放对象的办法。
4.引起内存错误的两种情况
a.释放掉一个正在使用的对象。
b.不用的对象没有释放掉,导致内存泄漏。
5.内存管理的基本原理
a. 使用"alloc"、"new"、"copy"、"mutableCopy"开头的方法创建的对象 就有拥有权,就应该负责释放。
b. 不是自己创建的对象,但是又想获得这个对象的拥有权,可以使用retain(属性的stter方法和init方法)。
c. 当一个对象不在使用了,就应该释放掉自己的那份拥有权(release autorelease)。
d. 不能去释放一个自己没有拥有权的对象。
6.可以使用autorelease来实现延迟释放,使用场合(在一个方法里面返回一个对象)
- (NSString *)fullName{NSString *string = [[[NSString alloc] initWithFormat:@"%@:%@",self.name, self.address] autorelease];return string; }- (void)printFullName{NSString *temp = [self fullName];NSLog(@"%@", temp); }
7. release 和 autorelease的区别
a. release的优点:可以立刻释放内存
autorelease的优点:可以延迟释放,操作方便,出错概率小。 在某一段时间内内存是增加的。
b. 企业里面的使用习惯:autorelease
8. 如何释放掉一个对象本身拥有的资源
通过在类的实现文件里面重写父类的dealloc方法来实现释放一个对象本身拥有的资源
a. dealloc方法是当这个对象的拥有者为0,那么系统会自动调用对象的dealloc方法,不能主动去调用
b. 在dealloc方法里面,先释放掉自己对象的拥有权,然后再调用[super dealloc]释放自己
9. 实际操作
a. 尽量使用访问器方法来操作属性变量(self.name)。
b. 在dealloc方法里面尽量不要使用访问器方法。
10. retain cycle
A对象里面拥有B对象, B对象里面拥有A对象,当A要释放掉自己的时候,必须等B对象释放掉自己对A的拥有权,B对象要释放掉自己的时候,必须等A对象释放对自己的拥有权,所以两者都释放不了。
解决方案:大的强引用小的(retain strong) 小的弱引用大的(weak)。
11. 不能使用retainCount去查看一个对象的拥有者,只能自己确保代码是按照内存管理的原理来操作的就OK了。
重写setter方法:
- (void)setFirstName:(NSString *)aFirstName{if (firstName != aFirstName) {[firstName release];firstName = [aFirstName retain];} }- (NSString *)firstName{return firstName; }
转载于:https://www.cnblogs.com/immustard/p/5063957.html
2015.12.21 内存管理(memory management)相关推荐
- HALCON: 内存管理(Memory Management)
内存管理(Memory Management) .net框架的运行时环境CLR(公共语言运行时)有一种被称为垃圾收集器的机制,CLR使用它来从内存中移除不再需要的.net对象. 正如前面提到的,在导出 ...
- 内存管理 (Memory Management)
1. 为什么要进行内存管理? 计算机内存虽然速度较快,但由于容量限制(一般8-32GB),不能一次性将所有的用户进程和系统程序全部装入内存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配. ...
- 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...
- linux 内存管理 ppt,Linux内存管理 Memory Manager.ppt
<Linux内存管理 Memory Manager.ppt>由会员分享,可在线阅读,更多相关<Linux内存管理 Memory Manager.ppt(24页珍藏版)>请在人人 ...
- Android 内存管理 Memory Leak OOM 分析
转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...
- 一步一步学linux操作系统: 21 内存管理_小内存分配与页面换出
slub 分配器工作原理 相关函数与结构体 进程创建的do_fork中会调用copy_process函数,这个函数会调用 dup_task_struct 函数 \linux-4.13.16\kerne ...
- Objective-C Memory Management Being Exceptional 异常处理与内存
Objective-C Memory Management Being Exceptional 异常处理与内存 3.1Cocoa requires that all exceptions mu ...
- SQL Server 2012笔记分享-6:理解内存管理
内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator ...
- 操作系统内存管理、Cache调度策略学习
原文 http://www.cnblogs.com/LittleHann/p/4012086.html 主题 操作系统 HTML 目录 0. 引言 1. 内存管理的概念 2. 内存覆盖与内存交换 3 ...
最新文章
- html 辅助标签,工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。...
- bzoj 4602: [Sdoi2016]齿轮
- 总编下午茶:挑战者心态能否帮助微软重回云计算巅峰?
- Python 实现程序的单一实例
- 分布式缓存的25个优秀实践与线上案例 done
- 用户信息持久化解决方案
- 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
- 1)session总结
- 安卓版有道词典的离线词库-《21世纪大英汉词典》等
- 大数据时代下的办公自动化系统
- ImageMagicK之合成图片
- c51语言 二维数组,单片机语言C51程序设计
- B站笔试真题之[编程题]扭蛋机
- SQL注入原理及绕过技术
- Student的增删改查
- Java内存区域与Java内存模型
- NLP冻手之路(4)——pipeline管道函数的使用
- 一颗病毒大小的新型分子或可帮助人类找到暗物质
- Generative Adversarial Networks(CGAN、CycleGAN、CoGAN)
- 苹果闭门造车6年了!是否已经“翻车”?
热门文章
- BN处理较深的神经网络
- java记住用户名和密码_JAVA--高级基础开发Cookie实现记住用户名和密码
- AI学习笔记(十三)CNN之人脸检测
- 计算机视觉基础-图像处理 Task05 图像分割/二值化
- 深度学习训练和推理有何不同?
- selectprovider 分页_修改EFOracleProvider——解决分页排序问题
- threejs 纹理流动_ThreeJs 认识纹理
- python取消任务的方法_python里取消一个未曾执行的任务
- pytorch按照索引取batch中的数
- 取消hover效果_CSS3 transition过渡动画效果