内存管理大总结

<link rel="stylesheet" href="http://yandex.st/highlightjs/6.2/styles/googlecode.min.css">

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script src="http://yandex.st/highlightjs/6.2/highlight.min.js"></script>

<script>hljs.initHighlightingOnLoad();</script>
<script type="text/javascript">
$(document).ready(function(){
$("h1,h2,h3,h4,h5,h6").each(function(i,item){
var tag = $(item).get(0).localName;
$(item).attr("id","wow"+i);
$("#category").append(‘<a class="new‘+tag+‘" href="#wow‘+i+‘">‘+$(this).text()+‘</a></br>‘);
$(".newh1").css("margin-left",0);
$(".newh2").css("margin-left",20);
$(".newh3").css("margin-left",40);
$(".newh4").css("margin-left",60);
$(".newh5").css("margin-left",80);
$(".newh6").css("margin-left",100);
});
});
</script>
<div id="category"></div>

# 内存管理大总结
## 1.自动引用计数的概念
- 在OC中采用引用**计数机制**来管理对象的生命周期.

- 在实际的项目中,我们在函数内使用一个临时的对象,通常是不需要修改它的引用计数的,只需要在函数返回前将该对象销毁即可.
- 引用计数真正排上用场是,对象之间传递和共享数据.遵从引用计数这个规则的话,对象的生命周期的管理就完全可以交给引用计数了.

## 2.内存管理/引用计数
### 2.1.1 内存管理的思考方式
举例 对办公室照明设备所做的动作和对OC对象所做的动作

对照明设备所做的动作|对OC对象所做的动作|OC方法
------|---|---
开灯|生成并持有对象|alloc/copy/new/mutableCopy等方法
需要照明|持有对象|retain方法
不需要照明|释放对象|release方法
关灯|废弃对象|dealloc方法

小结:

- 自己生成的对象,自己持有
- 非自己生成的对象.自己也可以持有
- 不再需要自己持有的对象时释放
- 非自己持有的对象无法释放

这些有关的OC内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于OSX iOS应用开发.Cocoa框架中的Foundation框架类库中的NSObject类担负内存管理的职责.OC内存管理中的alloc/retain/release/dealloc方法分别指代NSObject类的alloc类方法,retain实例方法,release实例方法和dealloc实例方法.

- 自己生成对象并持有.举例:
`NSArray *arr1 = [[NSArray alloc]init]; //取得对象,并持有;`
- 非自己生成的对象,即使用alloc/copy/new/mutableCopy以外的方法取得的对象,也可以持有.举例:
`NSArray *arr2 = [NSArray array];//取得对象,但并不持有;`
`[arr2 retain];//自己持有对象`
- 不再需要自己持有的对象时释放.举例`[arr1/arr2 release];`特殊的是 针对arr1,自己生成并持有的对象,可以采用 `[arr1 autorelease];`,因为autorelease提供这样的功能,使对象在超出指定的生存范围时能够自动并正确的释放(调用release方法).
- 无法释放非自己持有的对象:如果对象的引用计数已经为0,则不能再次释放,非自己持有的对象更不能释放.

release和autorelease的区别

release|autorelease
--|--
对象立即释放|对象不立即释放,注册到autoreleasepool中,pool结束时自动调用release

### 2.1.2 alloc/retain/release/dealloc实现
- 在OC的对象中存有引用计数这一整数值(retainCount)
- 调用alloc/new/copy/mutableCopy/retain方法后,引用计数值+1.
- 调用release后,引用计数-1.
- 引用计数为0时,调用dealloc方法废弃对象

### 2.1.5 autorelease

`autorelease`的具体使用方法如下:

- 生成并持有`NSAutoreleasePool`对象;
- 调用已分配对象的`autorelease`实例方法;
- 废弃`NSAutoreleasePool`对象.

```
NSAutoreleasePool *pool = [][NSAutoreleasePool alloc]init];
id obj = [[NSObect alloc]init];
[obj autorelease];
[pool drain];
```
尽管如此,当在大量产生autorelease对象时,只要不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时候会产生内存不足的现象.正确的做法是 把自动释放池的创建放在for循环内.代码如下:

```
for(int i = 0; i< 100000;i++)
{
NSAutoreleasePool *pool = [][NSAutoreleasePool alloc]init];
//读入图像,产生大量`autorelease`的对象.

[pool drain];

}
```
**在OC中,也就是Foundation框架时,无论调用哪一个对象的`autorelease`实例方法,实际上调用的都是NSObject类的`autorelease`实例方法.但是对于`NSAutoreleasePool`类,`autorelease`实例方法已被该类重载,因此运行就会报错.**

```
//这样写是错误滴
NSAutoreleasePool *pool = [][NSAutoreleasePool alloc]init];
[pool autorelease];

```

时间: 2024-11-07 16:53:45

内存管理大总结的相关文章

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

OC内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF

计算机操作系统学习笔记_7_内存管理 --内存管理基础

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato

Windows内存管理的方式

一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导致物理内存消耗殆尽. 2. 虚拟内存:虚拟内存就是在硬盘上划分一块页面文件,充当内存. 当程序在运行时,有一部分资源还没有用上或者同时打开几个程序却只操作其中一个程序时,系统没必要将程序所有的资源都塞在物理内存中,于是,系统将这些暂时不用的资源放在虚拟内存上,等到需要时在调出来用. 当程序运行时需要