一 基本原理

1.什么是内存管理

  移动设备的内存有限,每个app所能占用的内存是有限制的。

  当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象,变量。

  管理范围:任何继承了NSObject,对其他基本数据类型(int, char, float, double,struct,enum等)无效。

2.对象的基本结构

  每个OC对象都有自己的引用计数器,是一个整数,表示"对象被引用的次数",即有多少个类正在使用这个OC对象。

  每个OC对象内部专门有4个字节的存储空间来存储引用计数器。

局部变量放在里,动态变量(对象)放在里。代码块执行完毕,栈里面的局部变量被销毁,但是堆里的东西是动态分布,不会被销毁,必须手动销毁,如果没有销毁会造成内存泄漏。(Java里没有指针变量,那么对象就会被自动回收)

3.引用计数器的作用

  当使用alloc, new 或者copy创建一个新对象时,新对象的引用计数器默认就是1。

当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象计数器不为0,那么在真个程序运行过程,它占用的内存就不能被回收,除非整个程序已经退出。

4.引用计数器的操作

  给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)。

  给对象发送一条retain消息,可以使引用计数器值-1。

  可以给对象发送 retainCount消息获得当前的引用计数器值。

5.对象的销毁

   当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收。

  当一个对象被销毁时,系统会自动向对象发送一条dealloc 消息。

  一般会重写dealloc方法,在这里释放相关资源。dealloc就像对象的遗言。

一般重写了dealloc 方法,就必须调用 [super dealloc] ,并且放在最后面调用。

  不要直接调用dealloc方法。

总结:

1)retain 计数器加1,返回对象本身。

2)release:计数器减1,没有返回值。

3)retainCount:获取当前计数器的值。

4)dealloc: 当对象被回收时,就会调用。

一定要调用[super dealloc] ,这个调用放到最后。

5)僵尸对象:所占内存已经被回收,僵尸对象不能被使用。

6)野指针:指向僵尸对象(内存不可用)的指针,给野指针发送消息会出错。

7)空指针:没有指向任何东西的指针(存储的东西是 nil ), 向空指针发送消息不会报错

二多对象的内存管理

总结:

1.当向占有某个对象时,应该让对象的引用计数器+1(让对象做一次retain操作)

2.当不占有某个对象时,让对象的引用计数器-1 (让对象做一次release操作)

3.谁retain,谁release

4.谁alloc,谁retain

5.当引用计数器为0,就会调用对象的 dealloc.

6. [super dealloc] 写在最后。

内存管理代码规范:

1.只要调用了alloc,就必须要有release( autorelease). 对象不是通过alloc产生的,就不要release.

2.set代码规范

1>基本数据类型: 直接赋值。

- (void) setAge: (int) age{
_age = age;
}

2)OC 对象类型:

- (void) setCar:(Car *) car{
//1. 先判断是不是新传进来对象
if( car != _car){
//2.对旧对象做一次release
[_car release]; //3.对新对象做一次retain
_car = [car retain];
} }

3.dealloc代码规范:

1)一定要调用[super dealloc] ;

2)并且一定要对当前对象所拥有的对象,一定要做一次release.

- (void) dealloc{
[_car release];
[super dealloc];
}

参考知识:

http://www.cnblogs.com/lianghui66/archive/2012/11/13/2768281.html

http://www.cnblogs.com/iflewless/p/3912604.html

http://www.cnblogs.com/langtianya/p/3722129.html

http://blog.sina.com.cn/s/blog_945590aa0102vnun.html

http://www.cnblogs.com/GISerYang/p/3346092.html

http://www.cnblogs.com/wendingding/p/3704739.html

IOS基础之 (十) 内存管理的更多相关文章

  1. IOS基础 Day-1手动内存管理

    辞职回家打算自学IOS开发,就在借个地方记录一下 Day-1      手动内存管理                   主要内容:release  retain必须配对好,不然会占用内存 慢慢积累导 ...

  2. IOS基础之 (十一) 内存管理 ARC

    一 内存管理 1. set 方法内存管理的相关参数 retain: release旧值,retain新值(值适用于OC对象) assign:直接赋值(set方法默认,适用于非OC对象类型,即基本数据类 ...

  3. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  4. 包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)

    @import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=Syn ...

  5. IOS 非ARC开发内存管理的几条规则

    关于ios内存管理.在开发过程中,内存管理很重要,我简单说明一下. 1.正确用法 UIView *v = [[UIView alloc] init]; //分配后引用计数为1 [self.view a ...

  6. iOS 下ARC的内存管理机制

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  7. iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

    最近接了个小任务,和公司的iOS小伙伴们分享下instruments的具体使用,于是有了这篇博客...性能优化是一个很大的话题,这里讨论的主要是内存泄露部分. 一. 一些相关概念 很多人应该比较了解这 ...

  8. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  9. iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存

    iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...

随机推荐

  1. jquery堆栈与队列

    期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待

  2. 十一、常用的NSArray和NSMutableArray方法

    1.概念 用来存储OBJ对象的有序列表,它是不可变的 2.创建常用方法 + (id)array + (id)arrayWithObect:(id)anObject + (id)arrayWithObe ...

  3. IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程

    其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...

  4. java系列: 对不起,JavaFX——Java 8目前还不能救你(zz)

    JavaFX 是SUN公司在2007年JavaOne大会上首次对外公布的以Java为基础构建的富客户端平台,更让开发者印象比较深刻的则是其背后的JavaFX开发团队,仅仅在两年的时间就从1.0版本完善 ...

  5. Java系列:Add Microsoft SQL JDBC driver to Maven

    Maven does not directly support some libraries, like Microsoft's SQL Server JDBC. This tutorial will ...

  6. Django实际站点项目开发经验谈

    开发了两个月的Django站点正式上线了,看着网站从无到有,从前端到后台,从本地开发到环境部署,一点一滴的堆砌成型,着实带给我不小的乐趣. Django站点介绍: 开发环境:阿里云服务器centos6 ...

  7. Android学习第六弹之Touch事件的处理

    在移动开发过程当中,我们经常会遇到手势处理和事件触摸的情况,如果不了解整个事件的处理机制,对于开发的同学和码农是非常痛苦的,但是事件触摸的处理确实是一个非常复杂的过程,细讲起来,估计我都能讲迷糊,这里 ...

  8. [wikioi 1307][poj 2054]欧少堆(乱搞)

    题目:http://www.wikioi.com/problem/1307/ 题意:给你一个树,上面有n个节点,每个节点都有一个价值p,求一个n个节点的排列顺序,是的Σi*p[i]最小(要求父节点一定 ...

  9. SequoiaDB 系列之六 :源码分析之coord节点

    好久不见. 在上一篇SequoiaDB 系列之五   :源码分析之main函数,有讲述进程开始运行时,会根据自身的角色,来初始化不同的CB(控制块,control block). 在之前的一篇Sequ ...

  10. 编写高质量代码改善C#程序的157个建议[4-9]

    前言 本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html.本文主要来学习记录一下内容: 建议4.TryParse比Parse好 建议5.使用int ...