【问题标题】:Comparing Objects Directly to nil将对象直接与 nil 进行比较
【发布时间】:2014-05-25 18:30:22
【问题描述】:

我在这里看到很多关于 Stack Overflow 的帖子,警告 Objective-C 用户将对象与 == 运算符进行比较。例如,始终建议不要使用以下内容。

if (string1 == string2) {} // string1 and string2 are both of type NSString *

我理解这个警告是因为== 运算符在这种情况下检查指针是否相等,而不是string1string2 的实际值。如果是这种情况,为什么我经常看到人们使用== 运算符将他们的对象与nil 进行比较。例如,我已经多次看到以下内容。

if (obj == nil) {} // obj is of type id, or any other object

如果将指针与== 运算符比较在NSStrings(或NSNumbers 或NSArrays 等)上是不好的做法,那么为什么nil 如此普遍。

这是标准吗,因为只有一种类型的 nil,即:nil 总是等于 nil
为什么使用== 运算符的直接比较对象在对象之间不受欢迎,但在与nil 比较时却忽略了?

感谢您的宝贵时间。

【问题讨论】:

  • 不是你不应该比较指针,而是人们经常没有意识到它不是在做内容比较。如果您确实需要测试对象身份,当然可以使用==if( objectIJustGotOutOfDataStructure == objectIAlreadyHave ){ //...
  • @JoshCaswell 好点,我同意大多数人只是在尝试(错误地)比较字符串中的值时使用==,而没有意识到他们正在执行指针相等测试.
  • 这就是我要说的;警告就是这样,而不是一般使用==
  • 两种相等性检查都有用处,理解差异比概括并说你应该总是以某种方式做更好。

标签: objective-c object nullable null


【解决方案1】:

使用 == 测试指针是否相等,这似乎是您在这种特殊情况下要测试的内容。您正在检查某个指针是否为 nil 指针。具体来说,一个等于零的指针。正如您所指出的,比较对象更复杂。对象之间的平等通常依赖于两个对象的某些内部部分是否“相同”。

对于字符串,“相等”可以表示“具有相同的字符”,但也可以表示“具有相同的字符(忽略大小写)”。在某些情况下,您可能希望 nil 字符串等于一个空字符串,甚至是一个只有空格的字符串。关键是您必须了解确定相等性的不同方法,以便为您的对象实现您自己的相等性定义。

请注意,在比较字符串或数组之类的内容时,检查指针相等性几乎不是您想要使用的。有一些有趣的优化会让你失望。例如,所有空的 NSArray 都指向同一个单例对象。

【讨论】:

    【解决方案2】:

    nil 类似于 C 中的 NULL 或 C++ 中的 std::nullptr。基本上什么都没有。

    当 Objective-C 中的对象未分配(尚未分配)时,指针nil

    所以if (obj == nil) 将检查obj 是否已分配(或初始化,因为它们经常一起发生)

    这种技术通常在编写自定义初始化程序或检查某个对象是否存在时使用。

    【讨论】:

    • 详细信息:只有在使用 ARC 编译时,本地未初始化的对象指针才会为 nil。否则它是未定义的,就像任何其他变量一样。
    • 有了 ARC,一切都变得简单多了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2018-04-06
    相关资源
    最近更新 更多