Object C学习笔记4-内存管理
Object-C的内存管理和.NET有些不一样,.NET的内存回收机制是使用GC自动处理回收,而Object-C本质上还是C语言,所以很多时候还是需要手动去管理内存回收。
1. Object-C生成一个对象
Engine *en=[[Engine alloc] init];
[en dealloc];
Object-C对象生成分配空间在堆上,需要使用指针来指向其引用。前面也说到了,Object-C中得对象其实就是C中的指针。
2. 对象初始化以及销毁方法
+(id) alloc; 注意这里的alloc是一个类方法,调用alloc方法之后会在内存中分配一块空间,并且引用计数会设置为1
+(id) init; 调用init方法表示初始化对象
-(void) dealloc; 这里注意一下dealloc不是一个类方法,而是一个实例方法。dealloc 方法用于销毁对象,当引用计数为0的时候系统会自动调用dealloc方法销毁对象
-(void) release; 调用这个方法用于释放对象的引用,引用计数会-1
-(void) retain ;调用这个方法用于将引用计数+1
- (NSUInteger)retainCount; 用于获取一个对象当前被多少对象拥有
3. 叫苦不迭的内存泄露
实例一:
Engine *en=[[Engine alloc] init];
Engine *en2=en;
[en print];
[en dealloc];
[en2 print];
[en2 dealloc];
实例一 代码
[en print]; 这段代码能够正确的输出数据;[en2 print] 和 [en2 dealloc] 方法则不能正常执行。因为en,en2 指针都指向了同一个对象引用,而[en dealloc]调用释放了这个对象。当en2 调用print 和 dealloc的时候,该对象已经不存在了。
实例二:
Engine *en=[[Engine alloc] init];
Engine *en2=en;
[en print];
[en release];
[en2 print];
[en2 release];
[en release];
实例二 代码
[en print]这段代码能够正常的输出数据,而[en2 print]仍然不能正常执行。为什么?当调用[[Engine alloc ] init] 的时候,en 指针指向这个对象,这个时候retainCount=1 。
Engine *en2=en 这个时候将指针en2也指向这个对象,retainCount=1;
当en调用release方法的时候,retainCount 数量-1,retainCount=0; 这个时候系统会自动调用dealloc方法,自动回收对象。所以当下面再次调用的时候则不能正常执行。
实例三:
Engine *en=[[Engine alloc] init];
Engine *en2=en;
[en2 retain];
[en print];
[en release];
[en2 print];
[en2 release];
实例三 代码
这段代码和上面一段代码的区别在于调用了[en2 retain]. 在Object-C中retainCount不会自动增加,需要调用retain才会增加。所以当调用[en2 retain]之后retainCount=2. 即使后面调用了[en release],retainCount仍然为1,对象不会去销毁。所以下面会正常执行。如果不调用[en2 release]那么retainCount会始终等于1,对象不会得到释放就会发生内存泄露。
4. 内存自动回收处理
上面的处理的确有点太麻烦了,内存管理简直就是噩梦。只要稍微不注意就内存泄露了。现在还有更好的一种方式解决以上问题,那就是autorelease pool(自动释放对象池)。使用自动释放对象池,在某些情况一下可以不用手工去处理对象内存的释放,貌似和.NET中的垃圾回收机制有点类似了,但是我们不要完全的依赖与它,这和自动管理内存还是有一定差距的。
Engine *en=[[[Engine alloc] int] autorelease];
Engine *en2=en;
[en2 retain];
[en print];
//[en release];
[en2 print];
[en2 release];
自动释放对象池
看到上面的代码,en 并没有显示去调用release方法。而autorelase pool 就是有这样的一个好处。
5. 自动回收原理简介
要使用自动回收我们必须手工创建自动释放对象池,NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。当NSAutoreleasePool自身释放的时候,会遍历数组中的所有对象,并且调用release方法。如果对象的retainCount=0 那么系统会释放这些对象,如果retainCount>0,则会内存泄露。
在某些情况下,NSAutoreleasePool 调用的销毁方法比较迟,这个时候会占用大量的内存,我们也可以使用内嵌的方式,创建多个NSAutorelease的实例,让占用的资源立马释放掉。
Object C学习笔记4-内存管理的更多相关文章
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- XV6学习笔记(2) :内存管理
XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...
- COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存执行原理
通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. / ...
- Cocos2D-X2.2.3学习笔记3(内存管理)
本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...
- 《C#高级编程》学习笔记----c#内存管理--栈VS堆
本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...
- Cocos2d-x 学习笔记(7) 内存管理 Sprite SpriteFrame Texture2D
1. 总结 Sprite和SpriteFrame和Texture2D关系紧密,三个类都继承了Ref类.精灵有成员精灵帧和纹理,精灵帧有成员纹理.精灵帧和纹理被精灵帧引用时,引用计数增加,不再被引用时, ...
- 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ...
- Linux内核学习笔记——内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
- ios学习笔记之内存管理
一,内存管理类型定义 1,基本类型 任何C的类型,eg: int,short,char,long,long long,struct,enum,union等属于基本类型或结构体 ...
- arm-linux学习笔记3-linux内存管理与文件操作
配置好linux系统之后需要vim配置一下,有助于我们的编程,主要的配置如下 在/etc/vim/vimrc文件中 "显示行号 set number "自动缩进 set autoi ...
随机推荐
- Java基础 之软引用、弱引用、虚引用 ·[转载]
Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1) 交流分类:Java|笔记分类: Ja ...
- c++课程学习(未完待续)
关于c++课程学习 按照计划,我首先阅读谭浩强c++程序设计一书的ppt,发现第一章基本上都是很基础的东西. 同时,书中与班导师一样,推荐了使用visual c++. 而师爷的教程里面推荐使用的是ec ...
- 从0开始搭建Element项目
第一步:安装 Node.js/NPM 下载Node.js:https://nodejs.org/zh-cn/download/ 下载安装即可. 第二步:安装 vue-cli 打开 cmd 创建,在命令 ...
- 1001. [BJOI2006]狼抓兔子【最小割】
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- [luogu2312] 解方程
题面 秦九韶公式 看了上面这个之后大家应该都会了, 就是读入的时候边读入边取模, 从\(1\)到\(m\)间将每一个数带进去试一下就可以了, 复杂度是\(O(nm)\)的. 古人的智慧是无 ...
- 一个简单的统计问题(解决方案:Trie树)
题目如图 输入几个不重复的单词和几个前缀,分别统计出单词中包含前缀的个数. Trie树 这个题目用到了 Trie 树.它在百度百科中的定义如下:在计算机科学中,Trie,又称字典树.单词查找树 ...
- 百度图表库ECharts
本文主要包含ECharts的介绍和教程.关于ECharts的应用就不多了,像经营状况.收支情况.数据分析等都需要以图表的形式展现,因为这样更直观. 一.介绍 ECharts,一个使用 JavaScri ...
- TensorFlow入门:线性回归
随机.mini-batch.batch(见最后解释) 在每个 epoch 送入单个数据点.这被称为随机梯度下降(stochastic gradient descent).我们也可以在每个 epoch ...
- idea 如何优雅的添加.ignore 忽略不必要提交的文件
最近有点时间然后就跑去搜了下idea热门的插件,一不小心发现了一个.ignore插件.有过在idea使用git都知道.gitignore文件,而这个插件就是能优雅的帮我们做这件事. 首先先讲下安装这个 ...
- Android攻城狮学习笔记-进阶篇一
点击快速抵达: 第1章 AndroidManifest配置文件 第2章 使用ListView显示信息列表 第3章 使用DatePicker及TimePicker显示当前日期和时间 第4章 使用Grid ...