什么是僵尸对象?所谓僵尸,就是过度释放的对象。在ios开发中,僵尸对象对于开发人员调试程序来说很有用。我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都不会被释放,程序长时间运行会占用大量内存。

那有么有什么其他方法来实现僵尸对象呢?下面小编就给大家介绍下,模仿XCode用代码实现僵尸对象的方法。

创建僵尸对象

在ios开发中,当一个普通对象的retainCount变成0的时候,会调用dealloc,代码要勾住dealloc后,就可进行一下操作:

1、创建一个新的僵尸类;

2、将此对象的isa指向僵尸类(这个对象就变成了僵尸类的对象了)

这样,以后所有发向这个对象的消息现在都会去僵尸类中找实现的方法,因为僵尸类没有自己的方法,所以会forwardInvocate:(NSInvocation*),在这之前,系统还会根据消息的selector,调用methodSignatureForSelector:方法生成NSInvocation对象,所以第一时间发现给僵尸对象的消息的时机是在methodSignatureForSelector:中。

僵尸类的实现需要满足的细节

1、不可以像实现普通类一样继承自NSObject,否则我们继承了很多NSObject中的方法,就不能够在methodSignatureForSelector:中截获这个消息;

2、需要实现methodSignatureForSelector:方法,在这里打印出相关的信息;

3、需要实现+initialize方法,这个方法是所有类被发送第一个方法前会调用的一个方法,如果僵尸类没有实现这个方法,那么就会forwardInvocate:了。

获取原始类名的方法

虽然我们可以在methodSignatureForSelector:中截获这个消息,但是这个对象的isa指针已经指向了僵尸类,怎样得到原始类的名字呢?有一个巧妙的办法就是创建的这个新的僵尸类的名字要用一下规则命名:NSZombie+原始类的名字,在methodSignatureForSelector:中就可以将前缀NSZombie去掉,得到原始类名了。

僵尸类的实现

@implementation NSZombie

- (id)init

{

self = [super init] ;

if (self) {

NSIndexSet *obj = [[NSIndexSet alloc] init];

[NSZombie dump:obj] ;

[obj release];

[NSZombie dump:obj] ;

}

return self ;

}

+ (void)dump:(id)obj

{

size_t size = malloc_size(obj) ;

NSLog(@"size:%zu, className:%s", size, object_getClassName(obj)) ;

}

@end

没有开启NSZombieEnabled的情况下,虽然对象已经被释放,但是这块内存并没有被复写,所以还是能够通过isa指针找对应类的信息的。size:16, className:NSIndexSetsize:0, className:NSIndexSet

开启了NSZombieEnabled之后,得到了,可以看到对象引用计数变成0之后,对象对应的类已经被改变,变成了一个僵尸对象。size:16, className:NSIndexSetsize:16, className:_NSZombie_NSIndexSet

以上就是僵尸类的创建、实现、用法相关知识,学习并掌握这些知识,对ios开发人员来说非常重要,不知不会创建僵尸对象的你学会了么?当然也欢迎分享更easy实现僵尸对象的方法。

iOS中僵尸对象的实现方法的更多相关文章

  1. IOS中图片拉伸技巧与方法总结(转载)

    以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...

  2. iOS 关于僵尸对象和僵尸指针的那些事儿

    引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...

  3. js中Number对象与MATH方法整理总结

    W3C的文档: Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用. MAX_VALUE 可表示的最大的数. MIN_VALUE 可表示的最小的数 ...

  4. iOS——浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法:

  5. iOS中归档对象的创建,数据写入与读取

    归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型.专门编写用于保存数据的任何模型对象都应该支持归档.比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对 ...

  6. python中datetime模块中datetime对象的使用方法

    本文只讲述datetime模块中datetime对象的一些常用的方法,如果读者需要更多datetime模块的信息,请查阅此文档. datetime模块的对象有如下: timedelta date da ...

  7. iOS中UIPickerView常见属性和方法的总结

    UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮. @property(nonatomic,assign) id<UIPickerViewDataSource&g ...

  8. iOS中的几个重要方法

    iOS开发中几个重要的方法: 加载类到内存,程序刚启动的时候调用,调用在main函数之前 1.+(void)load{ } 初始化类,类第一次使用的时候调用一次 2.+(void)initialize ...

  9. javascript中字符串对象常用的方法和属性

    前言 字符串是一种非常重要的数据类型,在Java等面向对象编程语言中,它代表对象类型,而在javascript中它却是一种基本数据类型,在开发的领域中,我们经常会碰到,无论是前端还是后台.比如后台验证 ...

随机推荐

  1. ThinkPHP连接sql server数据库

    亲身经历,在网上找连接sql server数据库的方法,还是不好找的,大多数都是照抄一个人的,而这个人的又写的不全,呵呵,先介绍一下我连接的方法吧.如果你是用THINKPHP连接,那么最重要的就是配置 ...

  2. java多线程之ThreadLocal

    ThreadLocal为每个线程保存变量,以保证数据同步. package Thread.Common; import java.util.Random; import java.util.concu ...

  3. C#使用EmguCV实现视频读取和播放,及多个视频一起播放的问题

    大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1)第一种方法,使用委托: private delega ...

  4. DEDE仿站经常用到的基本标签和变量

    一.针对于DEDE后台基本设置里面的使用到的数据标签. 主标题:{dede:global.cfg_webname/}  主要用于<title></title>里面 网 站描述: ...

  5. 怎么在logcat中显示system.com.print中的打印信息

    在logcat中显示信息可以用Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 1.Log.v 的调试颜色为黑色的,任何消息都会输出: 2.Log.d的输出颜色是蓝 ...

  6. type和role属性有什么区别呢

    type是规定标签的类型,比如<input />标签中使用type="button"就是代表一个按钮 使用type="text" 就是一个文本框,t ...

  7. esriSRGeoCS2Type Constants

    ArcGIS Developer Help  (Geometry)     esriSRGeoCS2Type Constants More geographic coordinate systems. ...

  8. MFC学习 消息钩子使用

    HANDLE h_KeyBoard; //当前进程的钩子, 另外WH_KEYBOARD_LL, 与WH_MOUSE_LL参数时, 是获取的底层的消息, 相当于获取的全局的 g_hKeyBoard = ...

  9. Windows下cwRsync搭建步骤

    文章(一) CwRsync是基于cygwin平台的rsync软件包,支持windows对windows.windows对Linux.Linux对windows高效文件同步.由于CwRsync已经集成了 ...

  10. android 拍照,裁切,上传圆形头像, 图片等比缩放

    最近太忙了,没有空更新博客,其它部分以后再更新: 今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但 ...