在我的应用程序中,我在比较两个NSNumber
对象时不小心使用了"==" :
NSNumber *number1; NSNumber *number2;
后来,在设置了这些对象的int
值后,我不小心这样做了:
if (number1 == number2) { NSLog(@"THEY'RE EQUAL"); }
而且,令人困惑的是,它有效!我可以发誓我被教导这样做:
if (number1.intValue == number2.intValue) { NSLog(@"THEY'RE EQUAL"); }
如何在两个NSNumber
对象之间使用"==" ,为什么?这是否意味着可以通过这种方式对它们进行比较,还是只是一个侥幸,这通常不能保证每次都有效?这真让我困惑:(
这不是侥幸.这是由于使用ARM64 CPU时Objective-C运行时的标记指针功能.
在Mac OS X 10.7中,Apple引入了标记指针.标记指针允许具有少量每实例数据的某些类完全存储在指针内.这可以消除对NSNumber等类的许多用途的内存分配的需要,并且可以提高性能.在ARM64上,Objective-C运行时包括标记指针,它们带来了所有相同的好处到了Mac
资源
这可能是一个侥幸.
来自NSHipster:
如果两个对象共享一组共同的可观察属性,则它们可以彼此相等或相等.然而,这两个对象可能仍然被认为是不同的,每个对象都有自己的身份.在编程中,对象的标识与其内存地址相关联.
您的语句可能会被评估为YES
因为number1
并且number2
指向同一个对象.如果它们具有相同的值但是两个不同的对象,则不起作用.
NSNumber
变量指向相同的明显原因是你明确地将一个分配给另一个,如下所示:
number1 = number2;
但还有一件事.从这个答案:
这可能是编译器优化或实现细节:因为NSNumber是不可变的,所以不需要它们是单独的实例.可能是一个实现优化思考它.可能的numberWithInt在随后使用相同的整数调用时返回一个单例.
但无论如何,最安全的使用isEqualToNumber:
,因为没有人知道其他" 事物 "潜藏在代码的深处,可能会或可能不会导致它评估YES
来自RyPress:
虽然可以直接比较NSNumber指针,但isEqualToNumber:方法是检查相等性的更可靠的方法.它保证两个值将相等,即使它们存储在不同的对象中.