处理从服务返回的NSDictionary值为NSNull或者<null>问题

在APP开发过程中,我们有时候要从服务器加载数据时,一般是都是用json或者xml解析后用NSDictionary保存,但是从服务器加载过来的数据直接使用时会崩溃,是因为在NSDictionary中的某个值为<null>或者NSnull ,但是我们用一般的检查根本检查不出来,如 if( [obc objectForKey:key]==nil) 没有效果,这时候就要对NSDictionary的中值做处理了,把NSDictionary中值为<null>或者NSnull替换成@""就行了,上函数:


- (id) processDictionaryIsNSNull:(id)obj{
    const NSString *blank = @"";

    if ([obj isKindOfClass:[NSDictionary class]]) {
        NSMutableDictionary *dt = [(NSMutableDictionary*)obj mutableCopy];
        for(NSString *key in [dt allKeys]) {
            id object = [dt objectForKey:key];
            if([object isKindOfClass:[NSNull class]]) {
                [dt setObject:blank
                             forKey:key];
            }
            else if ([object isKindOfClass:[NSString class]]){
                NSString *strobj = (NSString*)object;
                if ([strobj isEqualToString:@"<null>"]) {
                    [dt setObject:blank
                           forKey:key];
                }
            }
            else if ([object isKindOfClass:[NSArray class]]){
                NSArray *da = (NSArray*)object;
                da = [self processDictionaryIsNSNull:da];
                [dt setObject:da
                       forKey:key];
            }
            else if ([object isKindOfClass:[NSDictionary class]]){
                NSDictionary *ddc = (NSDictionary*)object;
                ddc = [self processDictionaryIsNSNull:object];
                [dt setObject:ddc forKey:key];
            }
        }
        return [dt copy];
    }
    else if ([obj isKindOfClass:[NSArray class]]){
        NSMutableArray *da = [(NSMutableArray*)obj mutableCopy];
        for (int i=0; i<[da count]; i++) {
            NSDictionary *dc = [obj objectAtIndex:i];
            dc = [self processDictionaryIsNSNull:dc];
            [da replaceObjectAtIndex:i withObject:dc];
        }
        return [da copy];
    }
    else{
        return obj;
    }
}


### iOS 开发中返回为 `null` 的原因分析 在 iOS 开发过程中,当函数或方法的返回为 `null` 或者解析 JSON 数据时出现 `[NSNull length]: unrecognized selector sent to instance` 错误,通常是因为数据源中的某些字段被标记为了 `NSNull` 类型[^3]。这种情况下,程序尝试调用不存在的方法(如 `length` 或 `count`),从而引发崩溃。 以下是可能的原因以及对应的解决方案: --- #### 原因一:JSON 数据中存在 NSNull 字段 在处理来自服务器端的 JSON 数据时,如果某个键对应的数据为空,服务端可能会将其设置为 `null`。而在 Objective-C 中,`null` 被映射为 `NSNull` 对象。因此,在访问这些字段时如果没有进行类型判断,则会触发上述错误。 ##### 解决方案: 在解析 JSON 数据之前,先检查字段是否为 `NSNull` 并对其进行特殊处理。例如: ```objc id value = jsonObject[@"key"]; if (value == [NSNull null]) { value = @""; // 将其替换为默认或其他逻辑处理 } NSString *stringValue = (NSString *)value; ``` 通过这种方式可以有效避免直接对 `NSNull` 发送不支持的消息。 --- #### 原因二:内存管理问题导致的对象释放 另一个可能导致返回 `null` 的原因是内存管理不当。尤其是在手动引用计数模式下(MRC),未正确保留对象或者过早释放对象都可能导致后续操作获取到已销毁实例的结果——即表现为 `null` 或其他异常行为[^1]。 ##### 解决方案: 确保遵循正确的所有权语法规则来管理对象生命周期;对于 ARC(Automatic Reference Counting),确认没有意外断开强引用链路的情况发生。同时也可以利用 Instruments 工具检测潜在泄漏点与悬空指针问题。 --- #### 原因三:接口设计差异引起冲突 有时 API 定义与其实际实现之间可能存在矛盾之处,比如声明了一个特定类型的返回却最终给出了不同的结果(如上面提到的例子)。这不仅限于自定义类库内部也可能存在于第三方框架集成场景之中。 ##### 解决方案: 仔细核对接口文档说明并与真实运行表现对比找出不符之处加以修正调整。必要时候联系供应商获得最新版更新修复此类 bug 。 --- ### 总结代码片段示范 下面给出一段综合考虑以上各点后的安全取方式样例: ```objc NSDictionary *jsonObject = ... ;//假设这是从网络请求得到并成功转换成字典形式的数据结构 for (NSString *key in jsonObject) { id value = jsonObject[key]; if ([value isKindOfClass:[NSNull class]]) { NSLog(@"%@ is Null", key); continue;//跳过该条目不做进一步处理 } if (![value respondsToSelector:@selector(length)]){ //这里可以根据具体需求扩展更多兼容性验证条件 NSLog(@"%@ does not support method 'length'", key); continue ; } NSString* safeString=(NSString*)value; NSLog(@"Key:%@ has Length:%lu ",key,(unsigned long)[safeString length]); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值