在 Objective-C 中向 nil 发送消息

2024-04-30

作为一名正在阅读 Apple 的 Objective-C 2.0 文档的 Java 开发人员:我想知道“向 nil 发送消息“ 意味着 - 更不用说它实际上如何有用了。摘录自文档:

Cocoa中有几种模式 利用这一事实。这 消息返回的值为零 也可能有效:

  • 如果该方法返回一个对象,任何指针类型,任何整数标量 大小小于或等于 sizeof(void*)、浮点型、双精度型、 long double,或 long long,然后 a 发送到 nil 的消息返回 0。
  • 如果该方法返回一个结构体,如 Mac OS X ABI 函数所定义 致电指南返回 注册,然后发送一条消息到 nil 为每个字段返回 0.0 数据结构。其他结构数据 类型不会用零填充。
  • 如果该方法返回除上述值之外的任何值 输入消息的返回值 发送到 nil 是未定义的。

Java 是否让我的大脑无法理解上面的解释?或者我是否遗漏了一些东西,可以让它像玻璃一样清晰?

我确实了解 Objective-C 中消息/接收器的想法,我只是对恰好是的接收器感到困惑nil.


嗯,我认为可以用一个非常人为的例子来描述它。假设 Java 中有一个方法可以打印 ArrayList 中的所有元素:

void foo(ArrayList list)
{
    for(int i = 0; i < list.size(); ++i){
        System.out.println(list.get(i).toString());
    }
}

现在,如果您像这样调用该方法: someObject.foo(NULL);当它尝试访问列表时,在本例中是在调用 list.size(); 时,您可能会得到一个 NullPointerException 异常。现在,您可能永远不会使用这样的 NULL 值调用 someObject.foo(NULL) 。但是,您可能已经从一个方法获取了 ArrayList,如果在生成 ArrayList 时遇到一些错误(例如 someObject.foo(otherObject.getArrayList()); ),该方法会返回 NULL。

当然,如果你这样做,你也会遇到问题:

ArrayList list = NULL;
list.size();

现在,在 Objective-C 中,我们有等效的方法:

- (void)foo:(NSArray*)anArray
{
    int i;
    for(i = 0; i < [anArray count]; ++i){
        NSLog(@"%@", [[anArray objectAtIndex:i] stringValue];
    }
}

现在,如果我们有以下代码:

[someObject foo:nil];

我们也有同样的情况,Java 也会产生 NullPointerException。 nil 对象将首先在 [anArray count] 处被访问。然而,Objective-C 不会抛出 NullPointerException,而是根据上述规则简单地返回 0,因此循环不会运行。但是,如果我们将循环设置为运行一定次数,那么我们首先会向位于 [anArray objectAtIndex:i]; 的 anArray 发送一条消息;这也将返回 0,但由于 objectAtIndex: 返回一个指针,而指向 0 的指针是 nil/NULL,因此 NSLog 每次循环都会传递 nil。 (虽然 NSLog 是一个函数而不是一个方法,但如果传递一个 nil NSString,它会打印出 (null)。

在某些情况下,最好有一个 NullPointerException,因为您可以立即知道程序出了问题,但除非您捕获异常,否则程序将崩溃。 (在 C 中,尝试以这种方式取消引用 NULL 会导致程序崩溃。)在 Objective-C 中,它只会导致可能不正确的运行时行为。但是,如果您的方法在返回 0/nil/NULL/归零结构时不会中断,那么您就不必检查以确保对象或参数为零。

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

在 Objective-C 中向 nil 发送消息 的相关文章

  • NSNumber 作为 NSDictionary 的键

    我想知道 NSDictionary 中的键是如何工作的 通常 我会使用 NSString 作为键 例如 NSString stringKey stringKey mydict objectForKey stringKey 如果我想使用 NS
  • 从字符串初始化单元

    我正在寻找一个Unit symbol String 一种初始化程序认出 不定义符号 这是一个代码片段 通过提供来说明我的问题有限解 to it 尽管下面的解决方案有效 但明确列出了基础框架如果 Apple 在即将推出的 iOS 更新中发布新
  • ARC-- 隐式桥接

    如果我理解正确的话我们可以分类void as a C 可保留指针类型 因此 将其分配给 Objective C 对象将被隐式桥接 但是 编译器会引发需要显式桥接的错误 const void somePtr void 0x12345678 v
  • 从带有参数的方法名称创建选择器

    我有一个代码示例 它得到SEL从当前对象 SEL callback selector mymethod parameter2 我有一个像这样的方法 void mymethod id v1 parameter2 NSString v2 现在我
  • ObjectAL自动中断处理错误

    我一直在 SpriteKit 游戏运行时打电话 以测试中断 我正在使用 ObjectAL 文档中的示例 名为 使用 OpenAL 对象和 OALAudioTrack http kstenerud github io ObjectAL for
  • 是否可以在 iphone、ipod、ipad 和 mac 上运行 iphone 应用程序?

    我想知道是否可以在 iphone 和 mac 上运行 iphone 应用程序 如果可以的话 你们可以建议我如何完成吗 任何人的帮助将不胜感激 Xcode中有一个选项可以创建Universal应用 但是 这仅涵盖 iDevices 如果您也希
  • Segue Unwind 返回到最后一个特定的视图控制器

    有没有一种方法可以让一个按钮展开回特定的视图控制器 例如 假设我有 ViewController A 和 B 两者都模态地转至 ViewController C 现在我了解如何转回之前的视图控制器之一 正如这里所解释的 https stac
  • 重新加载 UITableView 中的部分

    我正在编写一个应用程序 通知用户何时该服药 页面顶部的标签显示日期和tableView填充了特定日期需要服用的药物名称和时间 现在 这些部分是根据当天服用的药物数量来填充的 因此 部分的数量会随着时间的推移而动态变化 计划在该特定日期服用药
  • NSPopUpButton、绑定和缩短的寿命

    我试图了解使用 NSPopUpButton 是多么困难 它无疑是 Cocoa 中最难编程的用户元素 至少就我而言是这样 我想到的用例如下 我有一个名为 Port 的类 代表串行端口 属性中有一个名称字段 在 NSPopUpButton 中
  • 重置标题/副标题后如何调整标注气泡的大小

    我创建了一个名为 PushPin 的 MKAnnotation 它有标题和副标题 我希望能够稍后动态更改标题 我已经很接近了 所以我宁愿不必制作一个全新的 AnnotationView 但如果必须的话 我想那也可以 我的问题是 一旦更改标题
  • 大端还是小端? [复制]

    这个问题在这里已经有答案了 可能的重复 如何检查系统是大端还是小端 https stackoverflow com questions 4181951 how to check whether a system is big endian
  • 对于 iOS 6,如何在后台线程上加载数据然后更新 UI?

    有很多方法可以做到这一点 但 iOS 6 应用程序当前 现代 正确的方法是什么 这就是我现在正在做的事情 void viewDidLoad super viewDidLoad weak MyViewController weakSelf s
  • 如何在 Objective-C 中编写 lambda 方法?

    如何在 Objective C 中编写 lambda 方法 Objective C 中 lambda 的概念现在封装为Blocks http developer apple com mac library documentation Coc
  • 在代码中创建时 UISearchDisplayController 不工作?

    我正在开发一个选项卡栏应用程序 其中一个选项卡有一个连接到 UISearchBar 的 UISearchDisplayController 所有这些都已连接到 NIB 中并且正在工作 当我点击搜索栏时 范围 和 取消 按钮会飞入等 并且搜索
  • 在特定点停止 CABasicAnimation

    我正在使用创建的旋转动画CABasicAnimation 它旋转一个UIView超过2秒 但我需要能够阻止它UIView被感动了 如果我删除动画 视图将处于与动画开始之前相同的位置 这是我的动画代码 float duration 2 0 f
  • 如何在 iPhone 应用程序中运行进程而不阻塞用户界面

    我正在 iPhone 上访问照片库 需要很长时间才能导入我在应用程序中选择的图片 如何在辅助线程上运行该进程 或者我应该使用什么解决方案来不阻塞用户界面 我在这里使用 PerformSelectOnBackground 或 GCD 对示例代
  • NSString 到 Double 问题

    可能很简单 但我不明白 我有一个 NSString50 81114我想把它转换成双 目前我正在使用 string doubleValue 但这是作为50 811140000002这是怎么回事 Disco 由于精度有限double无法存储50
  • 将 NSWindow 的内容变灰

    我有一个NSWindow with 2 NSViews an NSSplitView和一个习惯NSView 访问数据以填充这些视图可能需要一些时间 在此期间 我想将这些视图的内容灰显 我的第一个方法是有一个黑色的第三个NSView覆盖另外2
  • 我如何让 WhatsApp 愿意向 iOS 中的特定用户撰写消息?

    我如何让 WhatsApp 愿意向特定用户撰写消息 当我在应用程序中选择联系人时 我想发送短信 这是我的代码 NSURL whatsappURL NSURL URLWithString whatsapp send abid XXX if U
  • iOS 7 故事板本地化与属性标签

    我正在使用 ibtool 从我的所有语言的基本情节提要中生成字符串文件 出于某种原因 ibtool 没有提取UILabel风格为 attributed 我没有这些标签的键 值对 有人知道为什么吗 我最终得出的结论是 使用 ibtool 无法

随机推荐

  • 使用 git,如何在冲突期间“使用他们的”?

    使用 git 如何执行 使用他们的 类型的分支合并命令 该命令应该用原始版本覆盖我的本地版本 要将您的 master 替换为 origin master git checkout master git branch M master old
  • SSDT-BI 可以与 SQL Server 2008 R2 一起使用吗?

    有人可以告诉我在 Visual Studio 2012 或 2013 中开发的 SSIS 包是否可以在 2008r2 服务器上运行吗 如果是 2008r2服务器上还需要安装其他软件吗 这里不关心部署 我只想通过 sql 代理作业在 2008
  • 同位素重叠图像?

    似乎它只发生在 Chrome 和 Safari 中 而不是 Firefox 我将它与基础响应框架一起使用 所以我不确定如何设置高度 Chrome Safari 中的图像之间似乎也没有足够的间距 我该如何解决 编辑 这是一个小提琴http j
  • 在 NuGet 包中添加解决方案级项目

    我想通过 NuGet 包将解决方案文件夹和解决方案项 不是项目 添加到解决方案文件中 我想这将通过 Powershell 来完成 我浏览了 NuGet Powershell 和 EnvDTE 的文档 但无法弄清楚 我会使用哪些命令 方法 我
  • 可以设计自定义推文按钮并利用数据属性吗?

    我正在使用自己的样式创建自定义推文按钮 但是当您选择自定义自己的样式时 您似乎无法使用数据属性 数据文本 数据网址等 仅当您使用使用小部件 javascript 的 Twitter 样式按钮时 数据属性的使用才显得可用 http platf
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • 如何从 ScheduledExecutorService 中删除任务?

    我有一个ScheduledExecutorService定期执行一些不同的任务scheduleAtFixedRate Runnable INIT DELAY ACTION DELAY TimeUnit SECONDS 我也有不一样的Runn
  • 使用 Underscore debounce 获取事件对象[React]

    我正在尝试对我已设法做到的操作使用去抖 但是我想将 e 作为参数传递 但它不起作用 我有什么办法可以做到这一点吗 constructor props context super props context this testing debo
  • Jupyter Notebook 上未显示结构化流输出

    我有两个笔记本 第一个笔记本正在使用 tweepy 从 twitter 读取推文并将其写入套接字 其他笔记本正在使用 Spark 结构化流 Python 从该套接字读取推文并将其结果写入控制台 不幸的是我没有在 jupyter 控制台上得到
  • Logstash 过滤器将“$epoch.$microsec”转换为“$epoch_millis”

    我正在尝试转换表单中的时间戳字段 epoch microsec to epoch millis Example 1415311569 541062 gt 1415311569541 Logstash 似乎没有任何乘法的方法 所以ts 100
  • WPF - 从 WPF 应用程序切换到 xbap

    我有一个可用的 WPF 应用程序 我希望看到它作为 xbap 运行 我需要在 WPF 应用程序中更改哪些内容才能使其作为 xbap 运行 当谈到可以以图形方式执行的操作时 两者之间的唯一区别是 XBAP 无法使用 BitmapEffects
  • 在 Kubernetes 中向 MySQL 添加另一个用户

    这是我的MySQL apiVersion apps v1beta1 kind Deployment metadata name abc def my mysql namespace abc sk test labels project ab
  • jQueryUI:正确删除可拖动元素

    我正在开发一个可视化编辑器 它需要用户可以根据需要添加 删除和拖动元素 每个元素都是一个div使用 jQueryUI 实现可拖动 新元素被附加到父元素上div代表工作空间 每个元素内部都有一个用于将其删除的按钮 这一切都很好 我遇到的问题是
  • 用于多部分/表单数据的 POSTMAN

    如何将 POSTMAN 用于 Multipart form data 它具有自定义标头来测试我的控制器 该控制器采用 2 个文件作为参数 public controller MultipartFile files POST HTTP 1 1
  • 未捕获(承诺中)语法错误:获取函数中出现意外的标记'

    我有几个结构如下的 JSON 文件 我们称之为 info json data title Job company Company past fulltime Former Company intern Women IT Priority 5
  • Joomla:在组件中编写和调用辅助函数

    初出茅庐的 Joomla PHP 开发人员 在了解如何做到这一点时遇到了困难 我发现搜索的所有内容都是旧版本的 Joomla 或其他框架 因此第一次时一切都很混乱 我想要一个可以从组件中的任何位置调用的辅助函数 基本上它需要一个用户 ID
  • 根据第二列求和并有条件地计数

    我在试图解决这个看似简单的问题时感到沮丧 我有一个像这样的数据集 df structure list Year c 2015L 2015L 2015L 2015L 2015L 2015L 2015L 2015L 2015L 2015L 20
  • 使用 page_action 时不出现弹出窗口

    我是 Google Chrome 扩展开发的新手 我有以下两个疑问 我使用时没有出现弹出窗口page action在manifest json中 但在我使用时出现browser action 我想知道为什么 还是我做错了 该图标也显示为非活
  • 如何卸载其他用户安装的应用程序?

    当我尝试调试 Windows 8 应用程序并且另一个用户帐户上已安装了一个副本时 我不断遇到此问题 DEP0700 应用程序注册失败 另一个用户已经安装了此应用程序的打包版本 未打包的版本无法替代它 冲突的包是 PackageName 由
  • 在 Objective-C 中向 nil 发送消息

    作为一名正在阅读 Apple 的 Objective C 2 0 文档的 Java 开发人员 我想知道 向 nil 发送消息 意味着 更不用说它实际上如何有用了 摘录自文档 Cocoa中有几种模式 利用这一事实 这 消息返回的值为零 也可能