nil、Nil、NULL、NSNull之间的区别

本文详细解析了nil、Nil、NULL和NSNull的概念及其应用场景,指出nil、Nil、NULL通常用于指针赋空值,而NSNull则为内容为空的对象,适用于数组和字典中占位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nil、Nil、NULL、NSNull之间的区别

nil的含义

指向一个对象的指针为空,用于给对象指针赋值为空,防止野指针的产生;也称nil为空对象:表示一个已经被释放了的对象,和值为空的对象(NSNull)不同。NSNull是一个对象,只不过这个对象的值为空

#ifndef nil
# if __has_feature(cxx_nullptr)
#   define nil nullptr
# else
#   define nil __DARWIN_NULL
# endif
#endif

给对象指针赋值为空:

NSString * name = nil;
NSString * url = nil;
id object = nil;

Nil的含义

指向一个类的指针为空,用于给类对象指针赋值为空

#ifndef Nil
# if __has_feature(cxx_nullptr)
#   define Nil nullptr
# else
#   define Nil __DARWIN_NULL
# endif
#endif

给类对象赋值为空:

Class class = Nil;

NULL的含义

指向C类型的指针,用于给C类型的指针赋值为空

#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
#  if !defined(__MINGW32__) && !defined(_MSC_VER)
#    define NULL __null
#  else
#    define NULL 0
#  endif
#else
#  define NULL ((void*)0)
#endif

给C类型指针赋值:

int * a = NULL;
char * ch = NULL;
struct aStruct = NULL;

NSNull的含义

NSNull是一个类,其继承自NSObject,只拥有一个类方法。实例对象表示这是一个内容为空的对象。主要用于数组、字典。

NSMutableArray * mArray = [NSMutableArray array];
[mArray addObject:[NSNull null]];
NSLog(@"%@", [mArray firstObject]); // 输出为:<null>

NSMutableDictionary * dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"null"];
NSLog(@"%@", dict[@"null"]); // 输出为:<null>

由此可见,可用NSNull的实例对象在数组、字典中占位,其所占有的位置为空。

nil、Nil、NULL的使用对比

先看下面做的一个实验:

NSArray * array = [NSArray arrayWithObjects:@"good", @"morning", nil];
//    array = nil; // 输出:0
//    array = NULL; // 输出:0
//    array = Nil; // 输出:0
    NSLog(@"%ld", array.count);
    // 分别使用上面三句注释的语句,输出值无区别


    Class class = [NSURL class];
//    class = Nil; // 输出:(null)
//    class = nil; // 输出:(null)
//    class = NULL; // 输出:(null)
    NSLog(@"%@", class);
    // 分别使用上面三句注释的语句,输出值无区别


    int a = 10;
    int * p = &a;
//    p = NULL; // 输出:0x0
//    p = nil; // 输出:0x0
//    p = Nil; // 输出:0x0
    NSLog(@"%p", p);
    // 分别使用上面三句注释的语句,输出值无区别

结论:

1> nil、Nil、NULL在使用上是没有什么区别的,但是程序员的一个约定:C结构的指针使用NULL;对象指针使用nil;类对象指针使用Nil。

2> 另外NSNull和nil、Nil、NULL具有本质上的区别。NSNull是一个对象,而nil、Nil、NULL只是给指针赋空值。

3> 在另外,给一个赋值为nil的对象发送消息,不会产生异常。当然给一个赋值为Nil、NULL的对象发送消息也不会产生异常,这个在例子中已经证实。故根据此条结论的总结为:nil、Nil、NULL目的都是给一个指针赋值为空,给空指针发送消息不会产生异常

### 将 `nil` 值转换为适用于 HTML5 的表示形式 在 Objective-C 中,`nil` 表示空指针,而容器类(如 NSArray 或 NSDictionary)无法直接存储 `nil` 值。为了使这些值能够被安全地传递到 H5 页面并正确解析,在实际开发中通常会使用 `NSNull` 来替代 `nil`[^4]。 当需要将数据从原生应用传递至 H5 页面时,可以通过以下方式处理: #### 数据准备阶段 如果某些字段可能为空,则应将其替换为 `NSNull` 实例后再放入字典或数组中。这样可以防止因尝试存储 `nil` 导致程序崩溃。例如: ```objc NSMutableDictionary *dataDict = [NSMutableDictionary dictionary]; if (!someValue) { dataDict[@"key"] = [NSNull null]; // 使用 NSNull 替代 nil } else { dataDict[@"key"] = someValue; } [_jsBridge callHandler:@"getInfo" data:dataDict]; ``` #### 在 JavaScript 端接收数据 JavaScript 并不存在类似于 `NSNull` 的概念,因此接收到的数据如果是 `[object Object]` 类型且其内部属性均为 `null`,则可以直接判断该值代表的是空值。以下是具体的实现逻辑: 假设通过 `_jsBridge.callHandler:` 方法传递了一个包含潜在 `NSNull` 的 JSON 对象给 H5 页面,那么可以在前端做如下校验: ```javascript function handleData(data) { const queue = data.queue; if (queue === null || typeof queue === 'undefined') { console.log('Received a null or undefined value'); return; } console.log(`Queue Value: ${queue}`); } // Example usage when receiving the message from native side. window.getCallbackFromNativeApp = function(nativeData) { handleData(JSON.parse(nativeData)); }; ``` 上述代码片段展示了如何检测来自 Native 层次的消息中的 `null` 和未定义情况,并采取适当措施加以应对。 另外需要注意的一点是在 iOS WebKit API 下可能会遇到编码解码过程中产生的异常字符问题[^5]。此时建议始终访问具体键名而非整个 body 字符串本身以规避乱码风险。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值