iOS------小谈Crash

一、僵尸对象(Zombie Objects)

1.概述

1.1-》僵尸对象:已经释放掉的对象。通常来讲,如果我们访问已经释放掉的对象或者向他发送消息的话都会引起错误的。因为指针指向的内存块认为我们无权访问或者它无法执行该消息,所以内核会抛出一个异常(EXC),表示我们不能访问该存储区域(BAD ACCESS).(EXC_BAD_ACCESS类型错误)

1.2-》调试解决该类问题通常采用NSZombieEnabled(开启僵尸模式)。

2、NSZombieEnabled

2.1-》Xcode提供的NSZombieEnabled,通过生成僵尸对象来替换dealloc的实现,当对象引用计数为0 的时候,将需要dealloc的对象转化为僵尸对象。如果之后再给这个僵尸对象发消息则抛异常。先选中Product -> Scheme -> Edit Scheme -> Diagnostics -> 勾选Zombie Objects 项,显示如下:



然后在Product -> Scheme -> Edit Scheme -> Arguments设置NSZombieEnabled、MallocStackLoggingNoCompact两个变量,且值均为YES。显示如下:


2.2->仅设置Zombie Objects的话,如果Crash发生在当前调用栈,系统可以把崩溃原因定位到具体代码中;但是如果Crash不是发生在当前调用栈,系统仅仅告知崩溃地址,所以需要添加变量。MallocStackLoggingNoCompact,让Xcode记录每个地址alloc的历史,然后通过命令将地址还原出来。

注意:发版前要将僵尸对象检测这些设置都去掉,否则每次通过指针访问对象时,都去检查指针指向的对象是否为僵尸对象,这就影响效率了。


3.代码中的注意事项

在ARC时代,避免访问释放掉的内存,代码需要注意的地方有:

3.1-》检查代码1:

不能使用assgin或unsafe_unretained修饰指向OC对象的指针

assign或unsafe_unretained都表示不持有对象,是弱引用。如果指针指向的对象被释放了,他们就变成了野指针,很有可能发生Crash.

建议1:assign仅用于修饰NSInteger等OC基础类型,以及short、int、double、结构体等C数据类型,不修饰对象指针;

建议2: OC对象属性一般使用strong关键字(默认)修饰。

建议3: 如果需要弱引用OC对象,建议使用weak关键字,因为被weak指针所引用的对象被回收后,weak指针会被赋为nil(空指针),给nil发任何消息都不会出问题。使用weak修饰代理对象属性就是很好的例子。

3.2-》检查代码2:

Core Foundation等底层操作:Core Foundation等底层操作它们不支持ARC,还需要手动内存管理。

二:野指针:(Wild pointer)

1.概述

1.1—》

野指针是指向一个已经删除的对象或未申请访问受限内存区域的指针。而这里的野指针主要是指对象释放后,指针未置空导致的野指针。该类Crash发生比较随机,找出来比较费劲,比较常见的做法是在开发阶段就提高这类Crash的复现率,尽可能的将其发现并解决。

1.2-》

向OC对象发出release消息,只是标记对象占用的那块内存可以被释放,系统并没有立即收回内存;如果此时还向该对象发送其他消息,可能会发生Crash,也可能没有问题。野指针造成的Crash随机性比较大,但是被随机填入的数据是不可访问的情况下,Crash是必现的。解决思路是:想办法给野指针指向的内存填写不可访问的数据,让随机的Crash变成必现的Crash。

2、设置Malloc Scribble

Xcode提供的Malloc Scribble,可以将对象释放后在内存上填上不可访问的数据,将随机发生变成不随机发生的事情,选中Product->Scheme->Edit Scheme ->Diagnostics – >勾选 Malloc Scribble项,结果如下:


设置了Enable Scribble,在对象申请内存后在申请的内存上填0xaa,内存释放后在释放的内存上填0x55;如果内存未被初始化就被访问,或者释放后被访问,Crash必现。

特别注意:

该方法必须连接Xcode运行代码才能发现,并不适合测试人员使用。

3.代码中的注意事项

检查使用assgin或 unsafe_unretained 修饰指向OC对象的指针 和 Core Foundation等底层操作。

三、内存泄漏

1.代码中的注意事项(ARC下的循环引用是内存泄漏的主要原因)

1.1-》检查代码1 :Core Foundation、Core Graphics等操作

Core Foundation、CoreGraphics等操作不支持ARC,还需要手动内存管理。

建议: 注意CF、CG对象的创建和释放。

1.2-》检查代码2 :NSTimer/CADisplayLink的使用,因为NSTimer/CADisplayLink对象的target会强引用self,而self又强引用NSTimer/CADisplayLink对象。

建议:使用扩展方法,使用block或 target弱引用目标对象 打破保留环,具体实现参考iOS实录8:解决NSTimer/CADisplayLink的循环引用

1.3-》检查代码3 :block使用代码。

建议:成对使用weakSelf和strongSelf来打破block循环引用(对于self没有引用的block是不会造成循环引用,不需要使用weakSelf和strongSelf)

原理:在block外定义弱引用(weakSelf),指向的self对象;在block内捕获的是这个弱引用(weakSelf),保证了self不会被block所持有;在执行block内方法时,生成强引用(strongSelf),指向了弱引用(weakSelf)所指向的对象(self对象);在block内部实际是持有了self对象,但是这个强引用(strongSelf) 的生命周期只在这个block执行的过程中,block执行执行完立刻就被释放了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • [这是第15篇] 导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的...
    南华coder阅读 7,466评论 10 78
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,140评论 30 470
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,810评论 10 69
  • 人生也许只是一场偶然的邂逅。现在,发现在越来越靠近自己,也许,只是一个偶然。偶然来过这 个世界,偶然遇到过一些人...
    顾若影阅读 155评论 0 0
  • 在孤单和吵闹中切换,有些不容易。前天还吵吵闹闹的打惯蛋说脏话,现在又回到一个人的空气中。自我意识里,我是喜欢寂寞的...
    Wisconsin0607阅读 172评论 0 0