iOS中僵尸对象的实现方法

什么是僵尸对象?所谓僵尸,就是过度释放的对象。在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中僵尸对象的实现方法的更多相关文章
- IOS中图片拉伸技巧与方法总结(转载)
以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...
- iOS 关于僵尸对象和僵尸指针的那些事儿
引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...
- js中Number对象与MATH方法整理总结
W3C的文档: Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用. MAX_VALUE 可表示的最大的数. MIN_VALUE 可表示的最小的数 ...
- iOS——浅谈iOS中三种生成随机数方法
ios 有如下三种随机数方法:
- iOS中归档对象的创建,数据写入与读取
归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型.专门编写用于保存数据的任何模型对象都应该支持归档.比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对 ...
- python中datetime模块中datetime对象的使用方法
本文只讲述datetime模块中datetime对象的一些常用的方法,如果读者需要更多datetime模块的信息,请查阅此文档. datetime模块的对象有如下: timedelta date da ...
- iOS中UIPickerView常见属性和方法的总结
UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮. @property(nonatomic,assign) id<UIPickerViewDataSource&g ...
- iOS中的几个重要方法
iOS开发中几个重要的方法: 加载类到内存,程序刚启动的时候调用,调用在main函数之前 1.+(void)load{ } 初始化类,类第一次使用的时候调用一次 2.+(void)initialize ...
- javascript中字符串对象常用的方法和属性
前言 字符串是一种非常重要的数据类型,在Java等面向对象编程语言中,它代表对象类型,而在javascript中它却是一种基本数据类型,在开发的领域中,我们经常会碰到,无论是前端还是后台.比如后台验证 ...
随机推荐
- Linux有问必答:怎样解决“XXX is not in the sudoers file”错误
问题:我想在我的Linux系统上使用sudo来运行一些特权命令,然而当我试图这么做时,我却得到了"[我的用户名] is not in the sudoers file. This incid ...
- VVDocumenter-Xcode 规范注释生成器 插件之安装调试适应新版本
1.下载地址: 很多时候,为了快速开发,很多的技术文档都是能省则省,这个时候注释就变得异常重要,再配合Doxygen这种注释自动生成文档的,就完美了.但是每次都要手动输入规范化的注释,着实也麻烦,但有 ...
- sql server Geometry 类型操作 笔记
sqlGeometry 类型为sql server 2008之后的版本 新加的一种CLR扩展数据类型,为广大sql server开发人员存储几何类型及空间运算提供极大的便利,下面说明geometry类 ...
- 硬盘安装ubuntu120.04分区方案
320G分区方案1/boot :256MB ext2swap :4G/ :40G ext4/tmp :5G ext4/var :20G ext4/usr :20G ext4/home :230GMB ...
- Grub2 使用摘记
>>>不使用子菜单 # sudo vim /etc/default/grub添加配置:GRUB_DISABLE_SUBMENU=yFrom:http://tieba.baidu.co ...
- php 分享两种给图片加水印的方法
本文章向码农们介绍 php 给图片加水印的两种方法,感兴趣的码农可以参考一下本文章的源代码. 方法一:PHP最简单的加水印方法 <?php // http://www.manongjc.com ...
- vc 递归删除非空文件夹
我觉得这是一个非常不错的递归例子 头文件 #pragma once #include <atlstr.h> #include <io.h> #include <strin ...
- SQL server 2016 安装步骤
1.进入安装中心:可以参考硬件和软件要求.可以看到一些说明文档 2.选择全新安装模式继续安装 3.输入产品秘钥:这里使用演示秘钥进行 4.在协议中,点击同意,并点击下一步按钮,继续安装 5.进入全局规 ...
- Testlink中分析结果的图表显示乱码
1.下载 tahoma.ttf 字体: 2.下载好后,我们将其放置到,testlink的安装目录的以下文件夹中: testlink/third_party/pchart/Fonts/ 接下来,修改配置 ...
- Powerdesigner 导出Excel格式数据字典 导出Excel格式文件
版权声明:本文为博主原创文章,转载请注明出处; 网上我也看到了很多的Powerdesigner 导出方法,因为Powerdesigner 提供了部分VBA功能,所以让我用代码导出Excel格式文件得以 ...