【其他】Objective-C 内存管理学习总结
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/OC_CG.html
最近学习了Objective-C语言(以下简称OC),其他的都还好,唯有它的内存管理让我不知所措。因为OC跟我熟悉的Java、C#、js语言不同。Java,C#和js都是自动的垃圾回收,资源都是托管给虚拟机或者引擎,让他们定期查找不再使用的对象然后销毁。而OC的内存管理跟C和C++一样完全手动,我们程序员需要负责一个对象从生到死的每个过程,想想都心累。如果不做内存管理,不释放对象资源,那对象就会一直在内存中,很容易就内存溢出,程序闪退。
OC的内存管理对任何继承了NSObject的对象都适用,对其他的基本数据类型无效。
在代码块运行完成后,栈空间的变量会自动回收,但是堆空间的对象是无法自动回收的,只能手动回收。在Java中,如果没有任何变量指向一个对象的时候,就会被标记回收了。
OC里每个对象都有自己的引用计数器,它是一个整数,表示对象被引用的次数。如果计数器是0,则表示没有变量引用它,就会被回收。如果计数器不为0,那它就会一直在内存中,不会被回收。
当一个对象被销毁的时候,系统会自动调用对象的dealloc方法,一般我们会重写dealloc方法,用来释放相关的资源。
如果重写了dealloc方法,那一定要调用[super dealloc],并且放在最后,因为要先销毁子对象的资源,然后让父对象去销毁,这和创建对象的过程相反。
如果一个对象引用计数器变成0,那这个对象就被释放了,它就叫做僵尸对象。
如果一个指针指向一个僵尸对象,那么这个指针就叫野指针。
访问一个僵尸对象就会报EXC_BAD_ACCESS,很常见的错误,有点类似Java里的空指针。
应该在对象释放的时候,给指针赋值nil,nil就是空指针,而调用空指针的方法是不会报错的,跟Java里完全不一样。
当使用alloc、new和copy创建一个新对象的时候,新对象的引用计数器默认是1。
跟引用计数器相关的常用方法有这3个:
- retain:引用计数器+1,并返回对象本身
- release:引用计数器-1,没有返回值
- retainCount:获得当前引用计数器的值
因为多个指针可以指向同一个对象,这样会使计数器加减混乱,所以我们在写OC代码的时候有两个原则:
- 谁创建,谁release
- 谁retain,谁release
总结一下就是“谁+1,谁-1”,只有这样,对象的引用计数器都可以正确地进行操作。
在OC里面有一个autoreleasepool(自动释放池)对象,它可以接管autorelease(自动释放)的对象,在这个自动释放池销毁的时候,它里面所有的自动释放对象都会调用release方法。
@autoreleasepool //创建了自动释放池对象
{
Animal *dog = [[[Animal alloc] init] autorelease]; [dog eat];
} //销毁了自动释放池对象
这样做的好处是显而易见的,可以自动帮我们把创建的对象的引用计数器减1,如果只有一个指针指向它的话(大多数情况都是如此),就不必我们手动release来释放了。
自从ios6有了ARC以后,内存管理就不用这么复杂了^_^
【其他】Objective-C 内存管理学习总结的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- C++内存管理学习笔记(5)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- C++内存管理学习笔记(6)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- C++内存管理学习笔记(7)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- Linux内存管理学习资料
下面是Linux内存管理学习的一些资料. 博客 mlock() and mlockall() system calls. All about Linux swap space 逆向映射的演进 Linu ...
- C++内存管理学习笔记(4)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- C++内存管理学习笔记(3)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- C++内存管理学习笔记(2)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- C++内存管理学习笔记(1)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- c++内存管理学习纲要
本系列文章,主要是学习c++内存管理这一块的学习笔记. 时间:6.7-21 之下以技术内幕的开头语,带入到学习C++内存管理的技术中吧: 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题 ...
随机推荐
- 【转】Linux上vi(vim)编辑器使用教程
Linux上vi(vim)编辑器使用教程 ------------------------------------------------------------ ikong ------------ ...
- 【转】 awk 学习笔记
本文参考的是 ubuntu 下 gawk version 3.1.6 以及 <sed&awk> 一 . awk 简介 awk 是一种解释型(tawk除外)文本处理语言 二 . aw ...
- Vue.js根据列表某列值更新filter
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- SQLServer2008修改sa密码的方法与SQL server 2008数据库的备份与还原
sa密码的修改转载自:http://blog.csdn.net/templar1000/article/details/20211191 SQL server 2008数据库的备份与还原转自 :htt ...
- JVM类加载机制---类加载的过程
一.类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用.卸载 7个阶段,其中验证.准备.解析 3个部分统称为 连接. 二.具体步骤 ...
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]
3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...
- 夏令营提高班上午上机测试 Day 4 解题报告
我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...
- BZOJ 3884: 上帝与集合的正确用法 [欧拉降幂]
PoPoQQQ大爷太神了 只要用欧拉定理递归下去就好了.... 然而还是有些细节没考虑好: $(P,2) \neq 1$时分解$P=2^k*q$的形式,然后变成$2^k(2^{(2^{2^{...}} ...
- 一步一步从原理跟我学邮件收取及发送 11.完整的发送示例与go语言
经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌. 例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...