当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题.

  内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内存,耗费内存资源直至程序结束.

  野指针则是指:当一个指针指向一个对象时,此对象已经被系统回收.然后当再次通过该指针去操作对象时,则会出现野指针错误.而当系统回收该对象时,并不会立即销毁,而此时,该对象则成为僵尸对象.

  在开发过程中,有人可能发现,有时僵尸对象也能访问.这是为什么呢?主要原因是因为XCode为了提高编码效率,并不会实时监测僵尸对象.所以也就意味着它依然留在内存,所以造成"对象被销毁后依然可以通过指针进行访问"的假象.

  那么,怎样解决这个问题呢?很简单,只需要在XCode中设置实时监测僵尸对象就可以了具体步骤如下:

  edit scheme --- Diagnostics --- 勾选Enable Zombie objects 即可.

  但这样会比较耗性能,导致编译时间延长.

  接下来,简单介绍下僵尸对象的销毁过程:

  假如一个对象person,其retainCount值为1,此时执行[person release],则会有如下过程

  1,判断retainCount - 1 == 0 (注意,此时对象依然存在,并未成为僵尸对象,而retainCount也未被真正减一)

  2,进入该类dealloc方法

  3,在dealloc方法中如果调用了[super dealloc],则此时对象retainCount == 0,该对象也成为僵尸对象.

  4,注意,如果没有调用[super dealloc]方法,那么该对象不会成为僵尸对象,其retainCount也不会减一.也就等于[person release]没有效果.

  僵尸对象细节:1,向其发送消息,会出现野指针错误

         2,如果在其类内部,可以通过成员变量名(地址)继续访问其成员属性,修改其值

OC内存管理--zombie对象的更多相关文章

  1. OC 内存管理机制总结

    OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...

  2. OC内存管理基础

    OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...

  3. QF——OC内存管理详解

    堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...

  4. OC内存管理-OC笔记

    内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...

  5. OC内存管理-黄金法则

    1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...

  6. OC内存管理总结,清晰明了!

    <span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...

  7. 31 (OC)* 内存管理

    31 (OC)  内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...

  8. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  9. 【0 - 1】OC内存管理

    一.内存管理概述 垃圾回收机制(GC):由系统管理内存,程序员不需要管理. OC中的垃圾回收:在OC2.0版加入垃圾回收. OC与iOS:OC有垃圾回收机制,但是iOS屏蔽了这个功能.原因:iOS运行 ...

随机推荐

  1. rqnoj71 拔河比赛

    题目描述 superwyh的学校要举行拔河比赛,为了在赛前锻炼大家,老师决定把班里所有人分为两拨,进行拔河因为为锻炼所以为了避免其中一方的实力过强老师决定以体重来划分队伍,尽 量保持两个队伍的体重差最 ...

  2. Opencv加载和显示图片

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ios ...

  3. Linux—fork函数学习笔记

    fork()函数 在赋值语句pid = fork();之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同.> 两个进程中,原先就存在的那个被 ...

  4. C#实现通过程序自动抓取远程Web网页信息的代码

    http://www.jb51.net/article/9499.htm 通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序.比方说我们有一个系统,要提取BaiDu网站上歌曲搜索排名.分析系统在 ...

  5. OMNET++工具的使用(2)

    http://blog.csdn.net/codingkid/article/details/7085214 首先解决一些概念上的问题: 1. 在omnetpp.org中提到的仿真模型和框架与OMNe ...

  6. Spring学习8-用MyEclipse搭建SSH框架 Struts Spring Hibernate

    1.new一个web project. 2.右键项目,为项目添加Struts支持. 点击Finish.src目录下多了struts.xml配置文件. 3.使用MyEclipse DataBase Ex ...

  7. MyEclipse中防止代码格式化时出现换行的情况的设置

    编辑完成代码,用MyEclipse的代码格式化后,本来不长的代码也被自动转成了多行.虽然自动换行以后在编辑器中一眼就能看到全部的代码,但是可读性却大打折扣,避免出现这种情况的办法是: 1.Java代码 ...

  8. sqlmap注入检测

    1.列出可利用数据库: sqlmap  -u  url  --dbs 2.列出某个数据库中表: sqlmap  -u  url   --tables  -D  south sqlmap  -u  ur ...

  9. ORA-00931: missing identifier ORA-06512: at "SYS.DBMS_UTILITY"

    Database db = DatabaseFactory.CreateDatabase();            string sql = "SELECT * FROM table&qu ...

  10. C++小思

    Bjarne那稀疏的棕褐色头发, 有点红的眼睛, 这个可爱的好老头, 感觉他更应该是一个哲学家, 因为他用编程的语言C++ 揭示了我们这个纷繁复杂世界的本质: 对象. 对的, 世界是由对象组成的, 并 ...