Raf*_*afi 13 compare objective-c nsnumber ios
在我的应用程序中,我在比较两个NSNumber对象时不小心使用了"==" :
NSNumber *number1;
NSNumber *number2;
Run Code Online (Sandbox Code Playgroud)
后来,在设置了这些对象的int值后,我不小心这样做了:
if (number1 == number2) {
NSLog(@"THEY'RE EQUAL");
}
Run Code Online (Sandbox Code Playgroud)
而且,令人困惑的是,它有效!我可以发誓我被教导这样做:
if (number1.intValue == number2.intValue) {
NSLog(@"THEY'RE EQUAL");
}
Run Code Online (Sandbox Code Playgroud)
如何在两个NSNumber对象之间使用"==" ,为什么?这是否意味着可以通过这种方式对它们进行比较,还是只是一个侥幸,这通常不能保证每次都有效?这真让我困惑:(
这可能是一个侥幸.
来自NSHipster:
如果两个对象共享一组共同的可观察属性,则它们可以彼此相等或相等.然而,这两个对象可能仍然被认为是不同的,每个对象都有自己的身份.在编程中,对象的标识与其内存地址相关联.
您的语句可能会被评估为YES因为number1并且number2指向同一个对象.如果它们具有相同的值但是两个不同的对象,则不起作用.
NSNumber变量指向相同的明显原因是你明确地将一个分配给另一个,如下所示:
number1 = number2;
Run Code Online (Sandbox Code Playgroud)
但还有一件事.从这个答案:
这可能是编译器优化或实现细节:因为NSNumber是不可变的,所以不需要它们是单独的实例.可能是一个实现优化思考它.可能的numberWithInt在随后使用相同的整数调用时返回一个单例.
但无论如何,最安全的使用isEqualToNumber:,因为没有人知道其他" 事物 "潜藏在代码的深处,可能会或可能不会导致它评估YES
来自RyPress:
虽然可以直接比较NSNumber指针,但isEqualToNumber:方法是检查相等性的更可靠的方法.它保证两个值将相等,即使它们存储在不同的对象中.
| 归档时间: |
|
| 查看次数: |
908 次 |
| 最近记录: |