这里浅谈一下objective c 的内存管理模式。内存管理这一块我每看一次都觉得有收获,以前都是自动垃圾回收的,不习惯objective c 尤其是在iphone os平台上的处理方式。
其实objc本身也有一个自动处理程式,即所谓的自动释放池(NSAutoteleasePool),它可以自动释放添加到该池中的对象使用的内存:程序最后加一句消息drain 给pool ,可以在释放池的时候将添加到该池的所有对象一同释放。对于mac os平台,我们完全不用管内存的问题,而不用担心内存不够。但是仅靠pool自动释放势必会造成大量的内存浪费。举个通俗的例子。我们在程序的开始新建了一个对象,并将该对象丢进自动释放池,那么该对象将一直存在,直到我们在程序尾发送drain消息给pool,也就是说他将无条件占用我们宝贵的内存。如果该对象只是我们用来作中介用的,使用一次后便不再有用,那之后它的存在毫无意义!可是我们能把它怎样呢,我们不可能在程序中途释放pool,因为那将同时释放其它有用的对象!
于是我们会自然想到,提供一种方法,可以随时释放特定的内存!这样不就完美了吗?事实上objc确实提供了一种方法:release。如代码[aFraction release]就是释放对象aFraction.
但是问题不是这么简单。在程序中一个对象可能被我们多次引用,它可能存在于一个数组中,也可能被其它位置的实例变量引用,如果你认为当前的某个对象aFraction对我已经没有利用价值了,将其处理掉,问题出现了,其它可能引用该对象的变量将同时瞬间化为乌有!这就麻烦了!我们不可能花费大量精力去记住这个对象在什么地方被引用了吧!但是不知道它是否被引用,我们又不能放心的释放它。
foundation框架为我们提供了一种解决方案:引用计数。系统为我们记下某个对象的引用次数,每当我们引用一次对象时,发送消息retain给该对象,则计数加1。当该引用无用了时,发送消息release给该对象,计数减1。注意,只是计数减1,而不是释放该对象!只用当计数被减到0时,系统自动释放该对象。这就解决了我们前面提到的问题。
对于iphone这样仅有16G内存的平台,可想而知节省内存是多么重要!因此我们应该习惯这样的内存管理方式,只要引用了某个对象,每当觉得不再有用的时候,就该及时发送release给它,而不是依赖[pool drain]来统一处理(事实上iphone不支持NSAutoreleasePool吧?)。
这里又牵涉到内存分配的问题了。什么时候才叫真正的对象引用呢?我们知道一个指针可能在多处被使用,但并不是每一次使用都是为它重新分配了内存的,有些时候只是简单的调用而已。如果我们不清楚这点,就很可能因此造成错误。试想我们“引用”了一下对象aFraction,但并没为其分配地址,当我们不再使用该引用时,如果release,就很可能将该对象误释放!有些抽象哈,举个简单的例子。
比如有个string 型对象message,要对其赋值可以有多种方式:
一、message=aMessage;
二、message=[aMessage copy];
三、message=[aMessage retain];
四、message=[NSString stringWithString:aMessage];
……
还有什么alloc init之类等等……
我们就要注意其本质的内存分配了,书面语既是要注意是浅复制还 是深复制。第一种方法所获得的message,其实并没有它自己的内存,如果我们释放aMessage, message 会在不经意间消失;释放message, aMessage也会受影响……
总之在objc中,我们要特别警惕某些对象是否指向同一地址,什么时候需要我们来release/delloc,哪些东西放在了NSAutoreleasePool里了,以什么方式建立的对象需要我们来释放内存,什么时候释放……对于这些东西实在应该归纳下
分享到:
相关推荐
在编程世界中,C语言因其低级特性而被广泛用于系统级编程,其中包括内存管理。内存管理是程序设计中的核心部分,它涉及到如何有效地分配、使用和释放内存资源。本主题将深入探讨如何使用C语言来实现内存管理的关键...
C#内存管理机制 C#内存管理机制是C#编程语言中的一种机制,旨在帮助程序员更好地管理内存资源。在C#中,程序员不需要手动管理内存,因为垃圾收集器会处理所有的内存清理工作。但是,了解C#内存管理机制仍然非常重要...
在计算机科学领域,内存管理是程序设计中的一个关键部分,特别是在高级编程语言中。动态内存管理允许程序在运行时请求和释放内存,提高了程序的灵活性。本项目关注的是连续动态内存管理,具体实现了一个基于“首次...
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
Linux内存管理是操作系统的核心组成部分,它负责有效地分配和回收内存资源,确保系统高效稳定地运行。在本实验中,我们主要探讨了Linux虚拟内存管理的原理、动态内存操作函数的使用,以及如何检测主存使用情况。 ...
操作系统内存管理是计算机科学中的核心领域,特别是在Linux这样的操作系统中,理解内存的分配、管理和优化至关重要。本实验报告聚焦于在Red Hat 9环境下进行的内存管理实践,旨在深入理解内存分片、分配策略以及其对...
操作系统内存管理是计算机科学中的核心概念,它涉及如何在多任务环境下有效地分配、使用和回收内存资源。在这个“操作系统内存管理实验(C语言实现)”中,我们将深入探讨这一主题,并通过C语言编写代码来模拟和理解...
Linux 内存管理源代码导读 Linux 内存管理是操作系统中最重要的组件之一,它负责管理计算机的内存资源,确保系统的正确运行。在 Linux 操作系统中,内存管理是通过页框管理、Slab 算法和动态存储器管理来实现的。 ...
在分析glibc内存管理的ptmalloc源代码之前,我们需要先了解一些基础知识,包括操作系统对内存的分配和管理方法,以及glibc内存分配机制。 内存管理是操作系统的一个核心功能,它负责维护和管理计算机系统中的物理和...
C++内存管理是编程领域中的一个关键话题,尤其对于C++开发者来说,它既是挑战,也是机遇。内存管理是C++复杂性和灵活性的核心,既能让经验丰富的程序员获得高性能和自由,也可能让初学者陷入无尽的调试困扰。由于C++...
整个内存管理系统可以分为2部分来看待: 第一部分是对物理内存的管理, 第二部分是对虚拟内存的管理. 物理内存管理的对象是板载的物理内存(DDRAM), 它把物理内存按页划分, 并把这些页放到一个池子里面. 物理内存管理...
模拟内存管理程序 本实验的目的是了解简单的固定大小内存分配方法,掌握分区存储管理技术,了解在分区管理机制下所需的数据结构。通过模拟内存管理程序,学生可以学习如何设计和实现一个基本的内存管理系统,包括...
### Linux源代码分析之内存管理 #### 摘要与关键词 本文档是对Linux内核内存管理系统的一个深入分析,特别是针对其源代码进行了详细的解读。Linux的内存管理是内核中最复杂的部分之一,它涉及到了内存初始化、地址...
在这个“操作系统课程设计内存管理”项目中,我们看到开发者使用了Microsoft Foundation Classes (MFC)库,这是一个C++类库,由微软为Windows应用程序开发设计。MFC简化了用户界面、数据库访问和网络编程等任务,但...
这份"内存管理源代码"提供了深入理解内存管理机制的宝贵资料,对于想要自己编写操作系统或者正在改进无内存管理系统的人来说,具有很高的参考价值。 在操作系统设计中,内存管理的目标主要有三个:防止内存碎片、...
Linux操作系统内存管理 Linux操作系统的内存管理是计算机科学中一个重要的领域。本文将详细阐述Linux操作系统的内存管理机制,包括物理内存和虚拟内存的管理机制、地址映射机制、内存碎片和内存不连续的问题解决等...
内存管理是计算机科学中的核心概念,特别是在编程语言如C++中。动态分区内存管理是一种用于在程序运行时分配和释放内存的方法,它允许程序根据需要动态地调整内存使用。本主题将深入探讨动态分区内存管理的基本原理...