nil、Nil、NULL、NSNull的区别和他们真正的意思

本文详细解释了NULL、nil和Nil的概念及其在C语言和Objective-C中的应用。NULL通常用于C风格指针,nil用于Objective-C对象指针,而Nil则表示Objective-C类类型的空值。

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

__DARWIN_NULL 将常量0,强制转换为void *,其意思是表示一个空的地址。表达含义这个指什么都没有指向。

#define __DARWIN_NULL ((void *)0)

NULL 本质上也是 ((void *)0) 其主要作用,C语言风格的指针,表示指向空的时候, 使用 NULL。

[NSApp beginSheet:sheet modalForWindow:mainWindow modalDelegate:nil //pointing to an object 
didEndSelector:NULL //pointing to a non object/class
contextInfo:NULL]; //pointing to a non object/class

Nil用于表示Objective-C类类型(Class) 的值为空的情况

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

nil 用于表示Objective-C中对象指针表示空值的时候。

id object = nil;  
// 判断对象不为空  
if (object) {  
}  

// 判断对象为空  
if (object == nil) {  
}  

NSNull 其本质是一个类类型,它表示语义为空对象,[NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值. [NSNull null]是一个对象


// 数组初始化,空值结束  
NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];  
// 判断数组元素是否为空  
NSString *element = [array objectAtIndex:2];  
if ((NSNull *)element == [NSNull null]) {  
}  

// 判断字典对象的元素是否为空  
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:  
    @"iPhone", @"First", @"iPad", @"Second", nil];  
NSString *value = [dictionary objectForKey:@"First"];  
if ((NSNull *)value == [NSNull null]) {  
}  

总结一下:不管是NULL, nil ,还是Nil 它们的本质都是((void*)0),指向一个表示空的地址也就是平时空指针。这样做的意义是,可以根据赋的初始值, 来确定对象的数据类型, 如果是NULL,表示C风格的指针类型, 如果Nil表示Objective-C类类型, 如果是nil.表示Objective-C中对象.NSNull 本身表示类类型的空对象。

### 将 `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、付费专栏及课程。

余额充值