当前位置:  开发笔记 > IOS > 正文

iOS - 当我将两个NSNumber与"=="进行比较时,为什么它可以工作?

如何解决《iOS-当我将两个NSNumber与"=="进行比较时,为什么它可以工作?》经验,为你挑选了2个好方法。

在我的应用程序中,我在比较两个NSNumber对象时不小心使用了"==" :

NSNumber *number1;
NSNumber *number2;

后来,在设置了这些对象的int值后,我不小心这样做了:

if (number1 == number2) {
    NSLog(@"THEY'RE EQUAL");
}

而且,令人困惑的是,它有效!我可以发誓我被教导这样做:

if (number1.intValue == number2.intValue) {
    NSLog(@"THEY'RE EQUAL");
}

如何在两个NSNumber对象之间使用"==" ,为什么?这是否意味着可以通过这种方式对它们进行比较,还是只是一个侥幸,这通常不能保证每次都有效?这真让我困惑:(



1> Marcio..:

这不是侥幸.这是由于使用ARM64 CPU时Objective-C运行时的标记指针功能.

在Mac OS X 10.7中,Apple引入了标记指针.标记指针允许具有少量每实例数据的某些类完全存储在指针内.这可以消除对NSNumber等类的许多用途的内存分配的需要,并且可以提高性能.在ARM64上,Objective-C运行时包括标记指针,它们带来了所有相同的好处到了Mac

资源



2> ShahiM..:

这可能是一个侥幸.

来自NSHipster:

如果两个对象共享一组共同的可观察属性,则它们可以彼此相等或相等.然而,这两个对象可能仍然被认为是不同的,每个对象都有自己的身份.在编程中,对象的标识与其内存地址相关联.

您的语句可能会被评估为YES因为number1并且number2指向同一个对象.如果它们具有相同的值但是两个不同的对象,则不起作用.

NSNumber变量指向相同的明显原因是你明确地将一个分配给另一个,如下所示:

number1 = number2;

但还有一件事.从这个答案:

这可能是编译器优化或实现细节:因为NSNumber是不可变的,所以不需要它们是单独的实例.可能是一个实现优化思考它.可能的numberWithInt在随后使用相同的整数调用时返回一个单例.

但无论如何,最安全的使用isEqualToNumber:,因为没有人知道其他" 事物 "潜藏在代码的深处,可能会或可能不会导致它评估YES

来自RyPress:

虽然可以直接比较NSNumber指针,但isEqualToNumber:方法是检查相等性的更可靠的方法.它保证两个值将相等,即使它们存储在不同的对象中.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有