iOS中HighCharts饼图NaN值替换:解决JSON写入崩溃问题
解决HighCharts iOS饼图NaN导致的崩溃问题
我来帮你搞定这个头疼的NaN崩溃问题,核心原因其实是你处理NSNumber的方式出了点小问题,咱们一步步来解决:
先搞清楚你之前的错误点
你写的替换NaN的代码self->numRPercentNJ = 0;有个关键问题:numRPercentNJ是NSNumber*类型(对象指针),直接赋值基本类型0会让这个变量变成nil(Objective-C里0等同于nil指针),当你把nil插入字典时,自然就会触发「无法向字典插入nil对象」的错误。
有效解决方案:确保数值始终是有效的NSNumber
推荐你写一个通用的工具方法,统一处理所有可能的无效数值(NaN、nil、NSNull),返回一个安全的NSNumber对象:
- (NSNumber *)safeValidNumber:(NSNumber *)originalNumber { // 处理nil、NSNull、NaN三种情况,返回包含0的NSNumber if (!originalNumber || [originalNumber isKindOfClass:[NSNull class]] || isnan([originalNumber doubleValue])) { return @(0); } return originalNumber; }
然后在组装饼图数据的时候,用这个方法处理每个数值:
pie.data = [NSMutableArray arrayWithObjects: @{ @"name": @"New Jersey", @"y": [self safeValidNumber:self->numPlusNJ] }, @{ @"name": @"Miami FLG", @"y": [self safeValidNumber:self->numPlusMiamiFLG] }, @{ @"name": @"Chicago", @"y": [self safeValidNumber:self->numPlusChicago] }, nil];
也可以直接在赋值时处理(不用工具方法)
如果不想额外写方法,也可以在每个数值处直接做判断:
// 逐个处理每个数值,确保是有效NSNumber NSNumber *safeNJ = (self->numPlusNJ && !isnan([self->numPlusNJ doubleValue])) ? self->numPlusNJ : @(0); NSNumber *safeMiami = (self->numPlusMiamiFLG && !isnan([self->numPlusMiamiFLG doubleValue])) ? self->numPlusMiamiFLG : @(0); NSNumber *safeChicago = (self->numPlusChicago && !isnan([self->numPlusChicago doubleValue])) ? self->numPlusChicago : @(0); // 组装数据 pie.data = [NSMutableArray arrayWithObjects: @{ @"name": @"New Jersey", @"y": safeNJ }, @{ @"name": @"Miami FLG", @"y": safeMiami }, @{ @"name": @"Chicago", @"y": safeChicago }, nil];
从源头避免NaN生成(额外建议)
如果这些数值是通过计算得到的(比如百分比除法),可以在计算时就处理除数为0的情况,从根源上避免NaN出现:
// 举个百分比计算的例子 NSInteger totalCount = ...; // 你的总数值 self->numPlusNJ = (totalCount == 0) ? @(0) : @( (double)njCount / totalCount );
这样处理后,所有传入HighCharts的y值都是有效的NSNumber对象,既不会有NaN导致JSON序列化崩溃,也不会出现nil插入字典的问题。
内容的提问来源于stack exchange,提问作者Shivam Tripathi
相关产品推荐
相关产品推荐

