OC内存管理总结一:

看了《ios编程》英文版(第二版)之后对内存管理进行一些总结。包括:1.内存管理基础(Memory Management Basics),2.C语言中的内存管理知识(Managing memory in C),3.通过对象管理内存(Managing memory with objects),4.引用计数(Reference Counting),5.使用autorelease(Using autorelease),6.存取器和内存管理(Accessors and memory management),7.实现dealloc(Implementing dealloc),8.copy and mutableCopy,9.关于堆(heap),数据块(data segment)和栈(stick)。

1.内存管理基础(Memory Management Basics)

       因为随机存取内存(Random access memory (RAM))读取比硬盘更快,所以当一个应用(application)运行时,所有的内存消耗来自于RAM。当一个操作系统像ios开启你的应用时,系统会为你的应用预留一堆闲置的RAM(When an operating system like iOS launches your application, it reserves a heaping pile of the system’s unused RAM for yourapplication)。这预留的内存叫做“堆”(the memory reservedfor your application is called the heap)。The heap is your application’s playground; it can dowhatever it wants with it, and it won’t affect the rest of the OS or anyother application.当你的应用创建一个对象时,会从系统给你这个应用的堆中拿一块出来,当创建越来越多的实例对象时就会从“应用堆”中拿更多的内存,这时候那些不再使用的对象所占用的内存就应该返回堆中以便能够让这块内存得到重复利用,(让后来创建的实例对象利用)。

这样重复的使用,返回,和重用内存需要一个正确的管理,否则会出现以下两个问题:1.过早的释放:当对象还在被利用时就已经把内存返还给堆了。2.内存泄漏:当一块内存不再被需要但也没有返还给堆,导致这块内存不能给其他对象或程序使用即不能被重复利用。

2.c语言中的内存管理知识(Managing memory in c)

我们先来看看C语言里面是如何进行内存管理的。在C语言里面,当需要被分配内存时,可以调用malloc函数来进行分配。如:

void function(void)
{
char *buffer = malloc(100);

}

当不再需要这些内存时调用free函数来释放内存如:
void function(void)

{

char *buffer = malloc(100);
// Do something with buffer
free(buffer);
}

3.通过对象管理内存(Managing memory with objects)

每个类都知道当实例化对象时需要多少个字节的内存(Every class knows how many bytes of memory it needs to allocate for an instance),当创建一个对象时向类发送alloc 消息,就会从堆中分配到正确数量的字节,就像C语言中的malloc一样(malloc 应该是memory alloc的缩写吧,因为alloc是分配的意思)。当然,你还应该有一个方法来释放内存,每个对象都实现dealloc方法,当对象接收到dealloc时,会返还内存给堆。dealloc方法只能由对象自己调用,而不能手动调用,既然是对象自己释放自己,那对象是怎么知道什么时候调用呢?这就引出了引用计数这一概念(However, you never explicitly send a dealloc message to an object; an object is responsible for sending dealloc to itself. That begs the question: if an object is in charge of destroying itself, how does it know when it is safe and right to do so? This is where reference counting comes into
play)。

4.引用计数(Reference Counting)

在Cocoa Touch框架中,苹果采用了手动引用计数的方式来进行内存管理来防止过早释放和内存泄漏。书中讲了一个故事来说明reference counting,故事讲的是一个小狗开始的时候有一个女主人,后来女主人结婚了,小狗就有了两个主人了,这时候就有两个人来喂小狗了,当男主人不要小狗了,这时候只剩下女主人一个人喂了,当女主人都不要了,这个时候小狗就没主人了也就没人喂了,小狗就会被饿死。如果把object看作小狗,reference counting的工作就是算出object有多少个owners,retainCount等于多少表示有多少个owers,当object为零个ower时,对象就会发送delloc消息给自己以释放内存。

当一个对象被创建时,retainCount等于1,当向对象发送retain消息时retainCount加1。当向对象发送release时,retainCount会减1,并且检查retainCount是否为0,若为0,则对象向自己发送dealloc消息。类似代码如下:

- (id)retain
{
retainCount++;
return self;
}
- (void)release
{
retainCount--;
if (retainCount == 0)
[self dealloc];
}

好吧,怕写得太多影响耐心,更多内容见下一篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值