Objective-C中如何处理NSString与NSNumber类型混用引发的崩溃问题?
解决方案
一、自动类型转换(解决重复编码问题)
通过给NSObject添加分类封装通用的类型转换逻辑,一处封装全局调用,无需在每个业务点位重复写判断代码。
1. 分类实现代码
头文件NSObject+SafeTypeConvert.h:
#import <Foundation/Foundation.h> @interface NSObject (SafeTypeConvert) /// 安全转换为NSNumber:支持NSString、NSNumber输入,其他类型返回nil - (NSNumber *)safe_numberValue; /// 安全转换为NSString:支持NSString、NSNumber输入,其他类型返回nil - (NSString *)safe_stringValue; @end
实现文件NSObject+SafeTypeConvert.m:
#import "NSObject+SafeTypeConvert.h" @implementation NSObject (SafeTypeConvert) - (NSNumber *)safe_numberValue { if ([self isKindOfClass:[NSNumber class]]) { return (NSNumber *)self; } else if ([self isKindOfClass:[NSString class]]) { return [(NSString *)self numberValue]; } // 兼容NSNull等异常类型,直接返回nil避免崩溃 return nil; } - (NSString *)safe_stringValue { if ([self isKindOfClass:[NSString class]]) { return (NSString *)self; } else if ([self isKindOfClass:[NSNumber class]]) { return [(NSNumber *)self stringValue]; } return nil; } @end
2. 使用示例
原来的代码可以直接简化为一行:
NSNumber *feed_id = [self.config.operationData.feedID safe_numberValue];
3. 源头优化(针对JSON解析场景)
大部分类型不匹配问题都来自后端接口返回字段类型不固定,推荐直接在模型解析层统一处理:
- 使用MJExtension时可配置全局类型转换规则,目标类型为NSNumber时自动转换NSString类型的输入值
- 使用YYModel时可通过全局转换钩子在解析阶段直接完成类型校正,从源头避免业务层出现类型异常
二、类型不匹配问题检测方案
- 调试阶段可在上述分类的转换方法中添加断言逻辑,当输入类型既不是NSString也不是NSNumber时触发断言,快速定位异常数据源
- 开启Xcode静态分析(Static Analysis),或集成OCLint自定义扫描规则,批量识别代码中
id类型直接赋值给明确类型变量的风险点 - 线上崩溃监控添加特征过滤,针对
unrecognized selector类崩溃筛选出NSNumber/NSString互相调用方法的点位,批量修复风险代码
内容的提问来源于stack exchange,提问作者childrenOurFuture
相关产品推荐
相关产品推荐

