当前位置: 首页 > news >正文

iOS僵尸对象之研究

Zombie Objects对象研究

一、Xcode 关闭ARC

project -> Build settings  搜索 Automatic Reference Counting      设置为NO

 

二、开启 僵尸对象 选项 

 

三、代码验证

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Person *person =[[Person alloc]init];
    NSLog(@"person:%@----%@",[self className:person],NSStringFromSelector(_cmd));
    person.name=@"红叶";
    
    [person release];
    NSLog(@"person:%@",[self className:person]);
    person.name=@"绿叶";
}
- (NSString*)className:(id)obj{

    const char * name=object_getClassName(obj);
    return [NSString stringWithUTF8String:name];
}

a.关闭ARC,关闭僵尸对象选项时

 

 [person release];执行后,person对象会自动执行dealloc方法。因为Scheme中关闭了僵尸对象选项,所以person对象释放后并不会生成僵尸对象

当再次调用person对象时,报错类型为:错误内存地址访问异常

打印结果:

2016-12-27 15:37:56.769 ZomObj[5515:213898] person:Person----viewDidLoad

 

b.关闭ARC,开启僵尸对象选项时

在[person release];之前

person对象为Person类,正常使用

在[person release];之后

person对象被释放了,由于scheme开启了僵尸对象选项,所以person对象在释放时调用的dealloc方法在底层被swizzle了

dealloc方法执行时,代码走的并不是清理资源,回收内存。而是copy了一个NSZombie对象模版,并修改zimbie对象的isa指针,形成了一个新的僵尸对象类_NSZombie_Person。所以在[person release];执行之后, 打印的person对象类型为_NSZombie_Person

_NSZombie_Person类中只有一个isa指针,里面没有其他的属性和方法,所以不能响应任何事件,所以在向这个僵尸对象发送消息时,就会报错,并打印出来。这非常有利于调试。

 打印结果:

2016-12-27 15:48:20.006 ZomObj[5624:218915] person:Person----viewDidLoad

2016-12-27 15:48:20.006 ZomObj[5624:218915] person:_NSZombie_Person

2016-12-27 15:48:20.007 ZomObj[5624:218915] *** -[Person setName:]: message sent to deallocated instance 0x6000000161d0

Message from debugger: Terminated due to signal 9

 

转载于:https://www.cnblogs.com/zhou--fei/p/6226295.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在一个大数组中有且仅有两个数相同,怎样尽快找出这两个数(未完成)
  • 字符串匹配算法
  • CXF:根据werservice代码生成WSDL(转)
  • 位运算的应用和实例
  • 深入理解css3中 nth-child 和 nth-of-type 的区别
  • 求最大公约数和最小公倍数
  • 方案撰写注意事项
  • Linux 常用命令使用方法大搜刮
  • 应用Hash函数(java描述)
  • 用java实现生产者和消费者问题
  • 【转】AngularJS 日期格式化 字典
  • Struts的线程安全问题
  • JSP中的pageEncoding和contentType的区别
  • 2016-wing的年度总结
  • java中split() replace() replaceAll()三个函数分析
  • Angular6错误 Service: No provider for Renderer2
  • echarts花样作死的坑
  • git 常用命令
  • java多线程
  • java中的hashCode
  • leetcode-27. Remove Element
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 记录一下第一次使用npm
  • 入手阿里云新服务器的部署NODE
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序测试方案初探
  • 【云吞铺子】性能抖动剖析(二)
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (10)ATF MMU转换表
  • (152)时序收敛--->(02)时序收敛二
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)终结任务
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) 未来三学期想要修的课 (日記)
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core中Quartz的使用方法
  • .NET Framework杂记
  • .NET Project Open Day(2011.11.13)
  • .NET处理HTTP请求
  • .NET单元测试
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net专家(高海东的专栏)
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...