You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:26