什么是僵尸对象?所谓僵尸,就是过度释放的对象。在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. 火狐firefox提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。”

    火狐firefox浏览器打开网也是时提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式.” 今早一来打开用PHPCMS做的网站时就提示这个错误,用其他浏览器打开提示的是 ...

  2. Java多线程之新类库中的构件CountDownLatch

    使用CountDownLatch类 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); ...

  3. java调用FFmpeg及mencoder转换视频为FLV并截图

    Conver.java package com.ll19.flv; public class Conver { public void run() { try { // 转换并截图 String fi ...

  4. C++学习42 输入和输出的概念

    我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...

  5. Hadoop2.6.0错误

    错误1: WARN hdfs.DFSClient: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOExc ...

  6. 业务中Spring使用

    不管是MVC框架还是DAO框架,在业务场景中能够通用的个人觉得AOP是一个重点,看是不是可以合理使用,其他的框架都是基础框架 ================================== 第一 ...

  7. 菜鸟-手把手教你把Acegi应用到实际项目中(4)

    今天就讲个ConcurrentSessionFilter. 在Acegi 1.x版本中,控制并发HttpSession和Remember-Me认证服务不能够同时启用,它们之间存在冲突问题,这是该版本的 ...

  8. 访问控制符private,default,protect和public

    程序,通过封装以实现"高内聚,内耦合". 个人理解,类内,包内,子类和所有类,是java的四个范围. private表示作用区域为类内,即只是自己(像牙刷). default表示作 ...

  9. AngularJs 入门系列-1 使用 AngularJs 搭建页面基本框架

    每当看到前端程序员在脚本.样式.表单处理逻辑中苦苦挣扎的时候,我就在想,为什么不用Angular Js 呢? Angular Js 支持页面前端的 MVC 模式开发,在 Angular JS 的支持下 ...

  10. [转]sql利用游标循环,遍历表循环结果集

    用 游标(Cursor) + While循环 的方法, 对Customers表中的CompanyName列进行遍历 ) declare pcurr cursor for select distinct ...