万神劫

万物天地为剑,神鬼妖邪为剑
劫波万渡,宇宙苍穹尽为剑
是为万神劫!

0条评论 2015-12-02

快速定位Invalid asset name错误

今天在整理手头一个 iOS 项目的日志时,发现其中有这么几行报错:

CUICatalog: Invalid asset name supplied: 
CUICatalog: Invalid asset name supplied: (null)

这错误以前还真没注意过,简单搜了一下,发现原来是初始化 UIImage 时传入了空字符串或者nil
当然正常人肯定是不会直接把这两种值直接传入的,一般都是前置逻辑出了些纰漏,比如这样:

NSString *fileName;
if (UserTypeTeacher == user.type) {
    fileName = @"teacher";
} else if (UserTypeStudent == user.type) {
    fileName = @"student";
}
UIImage *image = [UIImage imageNamed:fileName];

但是这个错误并不会中断 App 执行,如何找到其对应的代码呢?莫非要一个个检查项目里几十上百个 UIImage 初始化代码?
幸亏在 StackOverflow 发现了这个回答,可以通过断点来快速定位

首先需要进入 Xcode 左侧导航的 Breakpoint 面板,然后点击左下角的+,选择 Add Symbolic Breakpoint

然后在 Symbol 填入 [UIImage imageNamed:],在Condition 填入 !(BOOL)[$r2 length]

最后在真机上运行这个项目,当执行到传入nil或者空字符串的给 UIImage 的时候,就会自动断点了,然后循着堆栈信息即可找到对应的代码

至于那个神奇的 $2 是什么呢?可以看一下这篇文章 https://www.clarkcox.com/blog/2009/02/04/inspecting-obj-c-parameters-in-gdb/

comments powered by Disqus