Object-C中各类空值的分析

Object-C中各类空值的分析

nil

NULL

object-c

前言

初次接触Object-C时,经常会遇到这样的困惑,使用空值时,什么时候使用nil,什么时候使用NSNULL?而且似乎用NULL也可以,另外Object-c中还有一个Nil。这么多的空值表示容易让人迷惑,下面将能过逐一分析来理清楚这4者的区别。

NULL

NULL本质上是:(void*)0,即指向地址为0x0的指针,用于表示C指针中的空值。

nil

nil的本质上也是(void*)0,但它用于表示表示指向Objective-C中对象的指针的值为空。

Nil

本质上也是(void*)0,用于表示Objective-C类(Class)类型的变量值为空。

NSNull

类定义如下:

@interface NSNull : NSObject <NSCopying, NSSecureCoding>

+ (NSNull *)null;

@end

其中+ (NSNull *)null; 返回一个单例对象,其表示空值。定义NSNull是由于集合对象中不能有nil值,所以用NSNull类来代表在集合对象中的null 值。英文解释:NSNull is a class defines a singleton object used to represent null values in collection objects (which don't allow nil values).

[NSNull null]: The singleton instance of NSNull。

总结:从技术实现上来说,nil、NULL都是一样的。但是实际上这种定义能够增加代码的可读性。如果你给某人传递NULL值,那么某人就认为接收到的是C指针。如果是nil,那么认为接受的是一个对象。而Nil,则认为接受的是class。

参考

区分nil Nil NULL和NSNill(Objective C语言)

nil/Nil/NULL/NSNull的区别

http://stackoverflow.com/questions/5908936/difference-between-nil-nil-and-null-in-objective-c

What describes nil best? What's that really?

时间: 2024-10-12 18:47:19

Object-C中各类空值的分析的相关文章

C#中List&lt;object&gt;.Clear()方法和实例化new List&lt;object&gt;()操作的结果分析

    本文主要的目的是想简单的探讨一下C#中List针对内存的操作过程,以便以后遇到该种情况可以避免走进误区,内容非常简单,只是在此作为记录.能帮到人最好,帮不到就当给自己提个醒.C#将复杂的指针操作全都隐藏到后台去处理,以至于是我们很到看到C#的本质. C#中list<T> list=new List<T>();中new的过程是建立一块内存空间,是新建一个没有元素的空列表对象. C#中list.Clear()是把new之后的那块内存空间的内容清空,并不是删除这块内存空间,是清除

Java异常打印输出中常见方法的分析

Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的使用异常打印方法,导致在项目的后台日志中,没有收到日志或者日志信息不完整等情况的发生,这些都给项目埋下了若干隐患.本文将深入分析在异常日志打印过程中的若干情况,并给出若干的使用建议. 1. Java异常Exception的结构分析 我们通常所说的Exception主要是继承于Throwable而来,可以参

scala中List的泛型分析以及::类和Nil对象

学习了scala中List的泛型分析以及::类和Nil对象,List是对scala的类型系统的一个非常好的使用,进一步巩固List的知识对于理解scala的类型系统是非常有价值的.本讲主要分析了List的泛型.::类和Nil对象. List有两个非常重要的子类,一个是::,一个是Nil,这两个子类都是case class.Nil表示一个空的列表,而::表达的是一个非空的列表. 例子如下: case object Nil extends List[Nothing]{ override def is

DEBUG模式下, 内存中的变量地址分析

测试函数的模板实现 [cpp] view plain copy /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #define MY_TEMPLATE_H_2016_0123_1226 template<int iArySize> void fnTestDataType() { char szBuf[iArySize] = {'\0'}; unsigned short wT

linux中mmap系统调用原理分析与实现

参考文章:http://blog.csdn.net/shaoguangleo/article/details/5822110 linux中mmap系统调用原理分析与实现 1.mmap系统调用(功能)      void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset )      内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的

Socket.Server &#39;module&#39; object has no attribute &#39;fork&#39; 原因分析

Exception happened during processing of request from ('127.0.0.1', 65066)Traceback (most recent call last): File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_nobloc self.process_request(request, client_address) File "C:\P

C++中几个值得分析的小问题(2)

下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是一件很正常的事.那要是不一般情况呢?请看下面这个例子: class Person { public: Person(const string& str = "Normal Person") : ID(str) {} string ID; //作为一般的人身份是“普通人”,作为学生身

Java中的空值判断

Java中的空值判断 /** * 答案选项: * A YouHaidong * B 空 * C 编译错误 * D 以上都不对 */ package com.you.model; /** * @author YouHaidong * */ public class NullString { /** * @param args */ public static void main(String[] args) { String i = ""; if(i == i + 1) { System

Linux中块设备驱动程序分析

基于<Linux设备驱动程序>书中的sbull程序以对Linux块设备驱动总结分析. 开始之前先来了解这个块设备中的核心数据结构: struct sbull_dev { int size;                       /* Device size in sectors */ u8 *data;                       /* The data array */ short users;                    /* How many users