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)相关推荐

  1. HALCON: 内存管理(Memory Management)

    内存管理(Memory Management) .net框架的运行时环境CLR(公共语言运行时)有一种被称为垃圾收集器的机制,CLR使用它来从内存中移除不再需要的.net对象. 正如前面提到的,在导出 ...

  2. 内存管理 (Memory Management)

    1. 为什么要进行内存管理? 计算机内存虽然速度较快,但由于容量限制(一般8-32GB),不能一次性将所有的用户进程和系统程序全部装入内存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配. ...

  3. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  4. linux 内存管理 ppt,Linux内存管理 Memory Manager.ppt

    <Linux内存管理 Memory Manager.ppt>由会员分享,可在线阅读,更多相关<Linux内存管理 Memory Manager.ppt(24页珍藏版)>请在人人 ...

  5. Android 内存管理 Memory Leak OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  6. 一步一步学linux操作系统: 21 内存管理_小内存分配与页面换出

    slub 分配器工作原理 相关函数与结构体 进程创建的do_fork中会调用copy_process函数,这个函数会调用 dup_task_struct 函数 \linux-4.13.16\kerne ...

  7. Objective-C Memory Management Being Exceptional 异常处理与内存

    Objective-C Memory Management    Being Exceptional  异常处理与内存 3.1Cocoa requires that all exceptions mu ...

  8. SQL Server 2012笔记分享-6:理解内存管理

    内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator ...

  9. 操作系统内存管理、Cache调度策略学习

    原文  http://www.cnblogs.com/LittleHann/p/4012086.html 主题 操作系统 HTML 目录 0. 引言 1. 内存管理的概念 2. 内存覆盖与内存交换 3 ...

最新文章

  1. html 辅助标签,工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。...
  2. bzoj 4602: [Sdoi2016]齿轮
  3. 总编下午茶:挑战者心态能否帮助微软重回云计算巅峰?
  4. Python 实现程序的单一实例
  5. 分布式缓存的25个优秀实践与线上案例 done
  6. 用户信息持久化解决方案
  7. 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
  8. 1)session总结
  9. 安卓版有道词典的离线词库-《21世纪大英汉词典》等
  10. 大数据时代下的办公自动化系统
  11. ImageMagicK之合成图片
  12. c51语言 二维数组,单片机语言C51程序设计
  13. B站笔试真题之[编程题]扭蛋机
  14. SQL注入原理及绕过技术
  15. Student的增删改查
  16. Java内存区域与Java内存模型
  17. NLP冻手之路(4)——pipeline管道函数的使用
  18. 一颗病毒大小的新型分子或可帮助人类找到暗物质
  19. Generative Adversarial Networks(CGAN、CycleGAN、CoGAN)
  20. 苹果闭门造车6年了!是否已经“翻车”?

热门文章

  1. BN处理较深的神经网络
  2. java记住用户名和密码_JAVA--高级基础开发Cookie实现记住用户名和密码
  3. AI学习笔记(十三)CNN之人脸检测
  4. 计算机视觉基础-图像处理 Task05 图像分割/二值化
  5. 深度学习训练和推理有何不同?
  6. selectprovider 分页_修改EFOracleProvider——解决分页排序问题
  7. threejs 纹理流动_ThreeJs 认识纹理
  8. python取消任务的方法_python里取消一个未曾执行的任务
  9. pytorch按照索引取batch中的数
  10. 取消hover效果_CSS3 transition过渡动画效果