2

这里有几个线程讨论了向 Calendar 方法发送 nil 日期时在控制台中弹出的新 iOS 6 Xcode 错误:

-[__NSCFCalendar components:fromDate:toDate:options:]: fromDate cannot be nil
I mean really, what do you think that operation is supposed to mean with a nil fromDate?
An exception has been avoided for now.
A few of these errors are going to be reported with this complaint, then further 
violations will simply silently do whatever random thing results from the nil.

这个错误让我轻笑了一下,但让我开始思考......

我编写的导致此错误的代码从多个来源(来自日期格式化程序、字符串、用户输入等)获取日期信息,我真的不希望提供的每个日期都是有效的 - 我知道很好,有些会为零,我很高兴处理这些对象的结果。

当我第一次开始使用 Objective C 编程时,我读到的其中一个特性是向 nil 对象发送消息。这很棒,因为这意味着我不必担心传递 nil 对象。

现在我从 Xcode 收到了一条脾气暴躁的错误消息,告诉我我已经向一个 nil 对象发送了一条消息。

现在的推论是我必须在方法中使用它之前检查每个对象不是 nil 吗?我在使用 nil 对象做一些完全令人发指的事情吗?

4

2 回答 2

6

现在的推论是我必须在方法中使用它之前检查每个对象不是 nil 吗?

不,这不是推论。推论是你必须检查你发送到的日期参考NSCalendar,因为发送它的结果是 nil 参考是未定义的。目前它可能对你有用,但 Apple 可能会在未来的版本中改变这种行为,以做任何它想做的事情,包括打一只小海豹。哦,请你想想海豹宝宝好吗?

我在使用 nil 对象做一些完全令人发指的事情吗?

不,如果您想要返回的结果是 nil 或在这种情况下为零,则向可能为 nil的接收者发送消息是 100%没问题的。在这种情况下,您不会向 nil 发送消息。您正在向非 nil 接收者发送一个 nil参数,而该接收者并不期望它。在一种情况下,接收者为零;在另一种情况下,参数为零。

于 2013-04-18T22:26:42.927 回答
1

现在我从 Xcode 收到了一条脾气暴躁的错误消息,告诉我我已经向一个 nil 对象发送了一条消息。

不正确。你的NSCalendar(接收者)不是零。你作为方法的参数之一传递 的nil是什么。当你给它一个 nil 时,它不知道该怎么做,所以它会给你一条日志消息,而不是抛出一个异常并让你的应用程序崩溃。NSDateNSCalendarNSDate

于 2013-04-18T22:27:12.367 回答