iOS 8:僵尸对象与MRC调试

关键字:MRC  手动引用计数  僵尸对象  NSZombieEnabled

周日在某群遇到一份求助代码,大致情况是UITableViewController初始化正常,向下划去时应用崩溃。问题定位到覆盖的initWithStyle中,对方的代码有一处赋值语句:_name = name。这句话直接使用了后台存储变量,所以没走setter方法。我看对方是MRC代码,开了NSZombieEnabled才确认问题,惭愧。附上关键代码,作个记录。

.h文件

@property (nonatomic, copy) NSArray *name;

.m文件

- (id)initWithStyle:(UITableViewStyle)style {

// ...

_name = name; // bug点

// 解决方式一

_name = [name copy];

// 解决方式二

self.name = name;

// ...

}

顺带回顾下NSZombieEnabled标志。NSZombieEnabled变量用于调试内存相关问题,跟踪对象的释放过程。MRC时代作用很大,ARC时代若留意对象的所有权,通常不会遇到与内存相关的崩溃。启用NSZombieEnabled,它会用一个僵尸实现替换默认的dealloc实现,即当引用计数为0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是,向它发送消息时,它显示一段日志并自动跳转到调试器,这样可方便找出问题的原因[1]

参考:

[1]. Rob Napier 等著, 美团移动 译. iOS编程实战. 北京, 人民邮电出版社. 262页

时间: 2024-10-26 03:16:04

iOS 8:僵尸对象与MRC调试的相关文章

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

引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie Pointer)和僵尸对象(Zombie Object). 野指针 先来介绍一下野指针,C/C++中对野指针的定义为:野指针就是指向垃圾内存的指针,这个指针地址不是NULL.如果给一个指针赋值为NULL,那么该指针就是一个空指针,可以用if语句判读.但是对于野指针不能用if语句判断. 野指针产生的原因

iOS中僵尸对象的实现方法

什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都不会被释放,程序长时间运行会占用大量内存. 那有么有什么其他方法来实现僵尸对象呢?下面小编就给大家介绍下,模仿XCode用代码实现僵尸对象的方法. 创建僵尸对象 在ios开发中,当一个普通对象的retainCount变成0的时候,会调用dealloc,代码要勾住dealloc后,就可进行一下操作:

ios 概念: 僵尸对象 空指针 与 野指针

内存管理    2014年5月21日 僵尸对象:指向已经删除的对象内存空间

IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instruments动态分析内存泄漏>关注了内存泄露的问题,本篇正好相反,关注的是内存中那些被过度释放的对象(overreleased objects). 这篇的标题纠结了半天,到底是写EXC_BAD_ACCESS错误调试,还是写内存中僵尸对象的分析,最后还是选了个Duang~Duang~的标题. 今天在论坛上看到

用&quot;僵尸对象&quot;调试内存管理问题

Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回收它们.这种对象所在的核心内存无法重用,因此不可能遭到覆写.僵尸对象收到消息后,会抛出异常,其中准确说明了发送过来的消息,并描述了回收之前的那个对象.僵尸对象是调试内存管理问题的最佳方式. 开启僵尸模式的方法:Xcode->Product->Scheme->Edit Scheme->R

IOS里面查找和解决僵尸对象

内存泄漏是当一个对象或变量在使用完成后没有释放掉,那么如果我们走了另外一个极端情况会什么样呢?这就导致过度释放(over release)问题,从而使对象“僵尸化”,对象称为僵尸(zombies)对象.一个对象已经被释放过了,或者调用者没有这个对象的所有权而释放它, 都会造成过度释放,产生僵尸对象.试图调用僵尸对象方法应用会崩溃(应用直接跳出),并抛出异常EXEC_BAD_ACCESS,那么EXEC_BAD_ACCESS给予的提示通常是毫无debug价值的信息. 简单一句话描述: 僵尸对象:已经

iOS中的僵尸对象的实现

僵尸对象对于我们调试程序来说很有用,在XCode中打开僵尸对象的方法是设置NSZombieEnabled环境变量为YES,这导致所有的对象都不会被释放,程序跑起来会时间长了内存占用量很大,这次我们就要来写一些代码,模仿XCode中的实现,这样我们也能够大体上了解了XCode中实现僵尸对象的原理了. Mike Ash在他的博客中已经解释了僵尸对象实现的细节,我在这里就算是翻译一下吧...  (这些链接可能需要翻墙...) OC中的对象都是结构体,结构体中第一个字段是一个isa,指向对象的类对象,类

iOS内存管理(ARC,MRC)

iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理的问题: 1.内存泄露:不再需要的对象没有释放. 2.野指针:正在使用的对象提前释放. 引用计数: 1.每一个对象上都有一个引用计数器 2.当对象出生时引用计数器为1 3.当对象调用retain方法时引用计数器+1 4.当对象调用release方法时引用计数器-1 5.当一个对象引用计数为0时,这个

僵尸对象与野指针以及空指针

僵尸对象:占用空间被释放的对象 野指针:指向僵尸对象的指针(给野指针发消息会报错) 空指针:指向nil的指针(给空指针发消息会不报错) 因为给野指针发消息会报错,因此我们要监听僵尸对象,这样就可以在控制台输出错误原因 设置如下图