Objective-C 中 nil、NIL 和 null 的区别

2023-11-26

我想知道之间的区别nil, NIL, and null。 我用谷歌搜索了一下,发现了这个:

nil-> 指向 Objective-C 对象的空指针

NIL-> 指向 Objective-C 类的空指针

null-> 指向原始类型的空指针或缺少数据

但我无法清楚地理解“Objective-C 对象”和“类”这两个术语。

请向我解释一下。还有有没有类似的词NSNull or NSNil在 Objective-C 中?如果是这样,请解释一下它的用途。


nil是 Objective-C 对象的文字 null 值,对应于抽象类型id或通过以下方式声明的任何 Objective-C 类型@interface。例如:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

Nil是 Objective-C 类的文字 null 值,对应于类型Class。由于大多数代码不需要变量来引用类,因此它的使用并不常见。一个例子是:

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL是任意 C 指针的文字 null 值。例如,

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull是表示 null 的对象的类。事实上,只有一个对象,即返回的对象+[NSNull null]。它不同于nil因为nil是一个文字 null 值,即它不是一个对象。的单个实例NSNull另一方面, 是一个适当的对象。

NSNull经常用于基金会集合,因为它们无法存储nil价值观。就字典而言,-objectForKey:回报nil表示给定的键在字典中没有对应的对象,即该键尚未添加到字典中。如果你想明确表示你有某个键但它还没有值,你可以使用[NSNull null].

例如,以下内容会引发异常,因为字典无法存储nil values:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

另一方面,以下代码是有效的,因为[NSNull null]是一个非nil object:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

值得一提的是,Foundation 集合有使用初始化器nil作为对象列表末尾的标记,而无需指定列表中的元素数量。这只能发生,因为nil无法存储在 Foundation 集合中。例如,

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

As for NIL or NSNil,Objective-C或Apple Foundation中没有这样的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C 中 nil、NIL 和 null 的区别 的相关文章

  • 对 Objective-c 对象数组进行排序

    所以我有一个自定义课程Foo有许多成员 interface Foo NSObject NSString title BOOL taken NSDate dateCreated 在另一堂课上我有一个NSMutableArray包含这些对象的列
  • Objective C - 动态属性的respondsToSelector

    我目前面临的问题是检查对象 NSManagedObject 的属性是否存在 不幸的是方法 MyObject class respondsToSelector selector myProperty 总是返回NO 我认为这是因为CoreDat
  • AFNetworking 2.0 可达性不起作用

    我在使 AFNetworking Reachability 模块正常工作时遇到一些问题 我已经使用 ReachabilityStatusChangeBlock 设置了 AFHTTPRequestOperationManager 但它从未被调
  • 如何在 Objective-C 标头中引用 Swift 枚举

    有没有办法从 Objective C 标头引用 Swift 枚举 如果你想在 Objective C 头中查看 Swift 类 你可以使用 objc class Foo 我没有看到枚举有任何类似的东西 你想做的事情叫做forward dec
  • 如果部署目标 < 基础 sdk,如何检查是否使用了不可用的方法?

    我想知道当部署目标低于基础 SDK 时 您如何检查代码是否不调用不可用的方法 可以在 SDK 等于部署目标的设备上运行应用程序 但我搜索一种更 自动 的方式 任何想法 问候 昆汀 最简单的方法是使用 IPHONE OS VERSION MA
  • 如何命名一段代码并在不同的方法中调用它?

    我使用 Grand Central Dispatch 方法在队列中执行我的应用程序 我在该队列的计算中决定按钮的框架 我希望我的应用程序重新绘制其屏幕并计算旋转后的新帧 这是我所做的一些伪代码解释 CGFloat a 123 b 24 di
  • Objective C - ARC - 何时使用@autoreleasepool

    我读了一些关于 ARC 的文章 看到了这个 interface Address NSObject public NSString city end implementation Address Address init NSString c
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • 如何在pop UIViewController中删除UIParallaxDimmingView?

    我有一个UIViewController vc1这是在之后推送的UIViewController vc2 Both vc1 and vc2具有透明背景 问题 当我尝试弹出时vc2使用交互式弹出手势 从边缘平移 在我看来堆栈显得很神秘UIPa
  • 如何使用 XCode 在 iOS 应用程序中的推文中上传视频

    我是 iOS 开发新手 需要对我正在接管的 iOS 应用程序进行更改 以将视频添加到推文中 我当前的应用程序 UI 允许用户输入推文文本 但我将对其进行更改 以允许他们选择要与推文一起上传的视频 类似于 Twitter 应用程序的工作方式
  • 原生插入符位置 macos cocoa

    我希望能够使用 cocoa 或 appleScript 获取 Mac High Sierra 中任何应用程序内的全局插入符位置 我已经使用 NSEvent 来获取键盘和鼠标挂钩 但是有没有办法获取插入符位置挂钩 插入符号与鼠标位置不同 它会
  • Mockito - thenReturn 始终返回 null 对象

    我正在尝试实现 Mockito 来测试特定方法 但 thenReturn 似乎总是返回一个 null 对象 而不是我想要的 CUT public class TestClassFacade injected via Spring priva
  • 将 CFIndex 转换为 NSUInteger?

    我如何转换typedef signed long CFIndex to typedef unsigned int NSUInteger 如果我使用一个可以吗 CFIndex作为类型的参数NSUInteger 我还没有铸造它 编译者似乎也不介
  • 获得 IAP 产品响应后出现 Objective-C 错误

    此代码来自 Phonegap 代码 IAP 插件 错误发生在 发送的js 之后的代码行上 除了最后一个 nil 之外 发送到该函数的所有元素均非零 我什至将它们注销以确保它们已发送 该代码直接来自插件 https github com us
  • 如何在 Xcode 4.2 中创建 Shell 脚本目标?

    我想知道是否有人知道 XCode 4 1 如何创建 shell 脚本 该选项不存在 但在最新版本中可能会被称为其他名称 塔 在导航器中选择您的项目 单击 添加目标 为空目标选择 聚合 添加构建阶段 gt 添加运行脚本 单击构建阶段并编辑运行
  • 在集合视图单元格中播放视频,就像在 Facebook 应用程序时间轴中播放的视频一样

    我想在集合视图单元格中播放视频 要求就像 Instagram 时间线 播放视频就像在 facebook 时间线中播放视频 为此 我使用了 UICollectionViewCell 我有一些图像 没有视频 现在我是来自画廊的图像 我正在使用相
  • Objective-C++ 中的 boost::shared_ptr

    这是对我之前提出的一个问题的更好理解 我有以下 Objective C 对象 interface OCPP MyCppobj cppobj end implementation OCPP OCPP init cppobj new MyCpp
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何从 UILabel 创建图像?

    我目前正在 iPhone 上开发一个简单的类似 Photoshop 的应用程序 当我想要展平图层时 标签位于良好的位置 但字体大小不佳 这是我要展平的代码 UIGraphicsBeginImageContext CGSizeMake wid
  • 比较 Objective C 中的 NSNumber

    我是 Objective C 的初学者 对这种情况有点困惑 我有以下代码 if number1 lt number2 NSLog THE FOLLOWING NUMBER NSLog number1 NSLog IS LESS THAN N

随机推荐

  • 直接在函数声明上使用 function.prototype.bind

    为什么这是允许的 var f function console log this x bind x 1 为什么这不是或者更好为什么我在这种情况下会出现语法错误 function f console log this x bind x 1 那
  • 通过引用 C++ 中的模板函数传递数组

    下面的代码对我来说效果很好 include
  • 为什么 null 不是编译时常量?

    所以如果我有一个static final Object CONSTANT null 出于某种原因 如果我在另一段代码中引用它 例如doSomething CONSTANT 它不会在编译期间内联到代码中 所以而不是doSomething nu
  • Ionic 2:如何更新现有项目的 Ionic 库?

    在 Ionic 2 网站上找不到任何信息 例如 使用 Ionic 库 2 0 1 创建一个项目 如何将其更新到 Ionic 库 2 1 0 标准程序是什么 ionic lib update已弃用 如果您想更新 CLI 您需要运行 npm i
  • System.Web.Http.HttpPut 与 System.Web.Mvc.HttpPut 有什么不同

    之间有什么不同系统 Web Http HttpPut and System Web Mvc HttpPut 在 Web API 项目上使用 HttpPut 会导致错误 405 请求的资源不支持 http 方法 PUT 它们属于两个不同的框架
  • 如何知道选择了哪个单选按钮?

    我的 Ui 中有 3 个单选按钮位于同一个单选组中 他们是 var rbutton1 app createRadioButton dist 5 miles var rbutton2 app createRadioButton dist 10
  • 如何在iOS中的UITableViewCell中制作渐变背景?

    我按照下面的教程使用 CAGradientLayer 在 UITableViewCell 中制作渐变背景 http cocoawithlove com 2009 08 adding shadow effects to uitableview
  • 将字符串转换为Scheme中的代码

    如何将字符串转换为PLT方案中相应的代码 不包含string gt input port方法 例如 我想转换这个字符串 1 0 1 0 0 进入这个列表 1 0 1 0 0 是否可以在不打开文件的情况下执行此操作 方案有程序read用于从输
  • onEdit(e) 在附加组件中不起作用

    我编写了一个脚本 在本机电子表格中使用时效果很好 我现在尝试将其作为附加组件发布 并且发现onEdit e 不工作 当onOpen e and onInstall e 工作正常 我已经查看了有关授权模式和安装 启用附加组件的文档 但我认为我
  • 无法禁用 Core i7 中的硬件预取器

    我在尝试禁用 Core i7 系统中的硬件预取器时遇到错误 我按照链接中的方法进行操作如何以编程方式禁用硬件预取 在我的系统中 grep i msr boot config uname r CONFIG X86 DEBUGCTLMSR y
  • 无法解析的外部符号 _declspec(dllimport)

    我在 Visual Studio 中为我的控制台应用程序创建了一个 DLL 在我的 DLL 中 我有一个名为 Dialog MainMenu 的类 其中有一个 cpp 文件和一个 h 文件 以下错误消息 错误9错误LNK2001 无法解析的
  • runST 与 unsafePerformIO 的实际影响

    我想要类似的东西 f forall m Mutable v PrimState m r gt m gt v r gt v r illegal signature f gs x runST do y lt thaw x foldM g gt
  • 如何在大量数字中插入空格以使其更具可读性?

    我想出了这个 因为 stackoverflow 上提供的其他示例是用 C 编写的 string number fmt ulong n cout lt lt lt lt n lt lt lt lt endl char s 128 sprint
  • MongoDB + Node.js:无法正确插入日期

    我一直在使用节点 mongoskin连接这两个 一切都很好 直到我查询了一些 日期 字段 我认为该字段应该作为 javascript 返回Date目的 但结果的类型是字符串 这对我来说很奇怪而且不方便 插入看起来像这样 var doc da
  • 根据Python列表从yaml文件中检索数据

    我在 ipython 工作 我有一个 Yaml 文件和一个与我的 Yaml 文件相对应的 thomas id 列表 thomas 文件下第三行 下面只是该文件的一小部分 完整的文件可以在这里找到 https github com 108mi
  • 为什么选择 MVVM?它的核心优势是什么? [复制]

    这个问题在这里已经有答案了 为什么在处理 WPF 时我们选择 MVVM 而不是 MVC 或 MVP 使用它我们可以获得什么额外的好处 Edit 说实话 今天我去面试 也被问到了这个问题 我回答像 INotifyPropertyChanged
  • 删除flash 9中的右键菜单

    是否可以使用actionscript 3禁用右键菜单 非常感谢任何帮助 您可以使用 stage showDefaultContextMenu false 隐藏除设置选项之外的所有内容
  • Python urllib2 自动填表并检索结果

    我希望能够在站点上查询运行该脚本的计算机的保修信息 如果需要 它应该能够填写表格 例如惠普服务站点的情况 然后能够检索生成的网页 我已经准备好解析返回的结果 html 我只是遇到了麻烦 需要做什么才能对需要放入字段中的数据进行 POST 然
  • @id 和 @+id 有什么区别?

    我刚刚开始使用android 已经完成了大约5个布局文件 然而 我刚刚意识到我一直在互换使用 id和 id 但我不确定两者之间的确切区别是什么 你需要使用 id当您为视图定义自己的 Id 时 正是来自docs 字符串开头的 at 符号 表示
  • Objective-C 中 nil、NIL 和 null 的区别

    我想知道之间的区别nil NIL and null 我用谷歌搜索了一下 发现了这个 nil gt 指向 Objective C 对象的空指针 NIL gt 指向 Objective C 类的空指针 null gt 指向原始类型的空指针或缺少