iOS:Simulator尝试加载SVG文件时崩溃,该如何排查解决?
问题根因
- 你遇到的崩溃是标准的数组越界错误,和RGB颜色值高低完全无关。崩溃行直接取
colorsArray[0]、colorsArray[1]、colorsArray[2]三个索引,只要colorsArray的元素个数小于3,就会触发越界崩溃。 - 触发这个问题的原因是你用的SwiftSVG库解析从Icons8下载的SVG文件时,遇到了不支持的颜色格式:比如SVG使用了
currentColor动态值、HSL颜色格式、渐变填充、缩写十六进制色值等,导致解析颜色通道失败,生成的colorsArray长度不足3。
修复方案
1. 先修复UIColor扩展的越界风险
给颜色初始化代码加安全校验,避免硬取索引:
// 替换你原来的UIColor扩展代码 guard colorsArray.count >= 3 else { // 解析失败时返回默认颜色,可根据需求调整 self.init(white: 0, alpha: 1) return } self.init( red: colorsArray[0] / 255.0, green: colorsArray[1] / 255.0, blue: colorsArray[2] / 255.0, alpha: colorsArray.count > 3 ? colorsArray[3] / 1.0 : 1.0 )
2. 优化SVG导出配置
从Icons8导出SVG时,选择固定纯色填充,不要使用渐变、主题关联色、动态颜色参数,避免出现SwiftSVG不支持的颜色格式。
3. 可选:替换更稳定的SVG加载方案
Xcode 12及以上版本原生支持SVG资源,你可以直接把SVG文件导入xcassets的Image Set中,用UIImage(named:)直接加载,不需要引入第三方SVG解析库,稳定性更高。
其他代码优化建议
- 不要用
try!读取文件列表,一旦资源路径异常会直接崩溃,改成do-catch捕获错误处理异常场景。 - CollectionView配置cell时,每次添加新图标前先清空
cell.icon的原有子视图,避免cell复用时出现视图堆叠、内存泄漏的问题。 - 加载SVG的时候最好带后缀名校验,避免把非SVG的
icon前缀文件加入图标列表。
内容的提问来源于stack exchange,提问作者cheesecake
相关产品推荐
相关产品推荐

