我有一个if
例程,它将一个值与另外两个值进行比较(使用||运算符),如果语句的计算结果为YES
,则值firstActivity.stopTime
应该从null
更改为当前时间[NSDate date]
。
但是,它似乎评估为NO
,导致没有变化,即使我的NSLog
读数(以及我自己的观察结果)似乎确认它必须评估为{{1} }。
以下是代码:
YES
这是来自控制台的读数:
-(void) compareActivity
{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
TimedActivity *firstActivity = [TimedActivity MR_findFirstOrderedByAttribute:@"startTime" ascending:NO];
NSLog(@"1 Currently timed activity is %@",firstActivity.name);
NSLog(@"2 thisSpec.activityOfInterest is %@",self.thisSpec.activityOfInterest);
NSLog(@"3 Currently timed activity stopTime is %@",firstActivity.stopTime);
NSLog(@"4 thisSpec.benchmarkActivity is %@",self.thisSpec.benchmarkActivity);
if (firstActivity.name == self.thisSpec.activityOfInterest || firstActivity.name == self.thisSpec.benchmarkActivity)
{
firstActivity.stopTime = [NSDate date];
[localContext MR_saveToPersistentStoreAndWait];
NSLog(@"5 Currently timed activity stopTime is %@",firstActivity.stopTime);
}
NSLog(@"6 Currently timed activity stopTime is %@",firstActivity.stopTime);
}
有任何想法或建议吗?
谢谢!
更新
我这样更新了我的代码:
2014-04-28 22:15:06.588 WMDGx[5683:a0b] 1 Currently timed activity is Test 1
2014-04-28 22:15:06.588 WMDGx[5683:a0b] 2 thisSpec.activityOfInterest is Test 1
2014-04-28 22:15:06.589 WMDGx[5683:a0b] 3 Currently timed activity stopTime is (null)
2014-04-28 22:15:06.589 WMDGx[5683:a0b] 4 thisSpec.benchmarkActivity is Test 2
2014-04-28 22:15:06.589 WMDGx[5683:a0b] 6 Currently timed activity stopTime is (null)
现在它完美无缺!有趣的是,我在一段时间之前遇到了同样的问题,并且实际上曾尝试更改代码,但这次我显然做错了什么,让我觉得这是错误的做法。
非常感谢!
答案 0 :(得分:3)
你不能用==
来比较对象指针,你需要使用isEqual:
来比较对象
[firstActivity.name isEqual: self.thisSpec.activityOfInterest] || [firstActivity.name isEqual: self.thisSpec.benchmarkActivity]
如果它们是NSString
,您可以使用isEqualToString:
答案 1 :(得分:3)
您必须将==更改为isEqualToString:
if ([string1 isEqualToString:string2]){}
==对于非原语(如NSString)只是比较指针(内存地址),这肯定不是你想要的。
答案 2 :(得分:1)
使用isEqualTo:
代替==
。
答案 3 :(得分:1)
如果您使用指针,则需要将==
转换为[isEqual:
]以验证对象
if (firstActivity.name isEqual self.thisSpec.activityOfInterest || firstActivity.name isEqual self.thisSpec.benchmarkActivity)
{
firstActivity.stopTime = [NSDate date];
[localContext MR_saveToPersistentStoreAndWait];
NSLog(@"5 Currently timed activity stopTime is %@",firstActivity.stopTime);
}
如果您使用的是firstActivity.name且self.thisSpec.activityOfInterest为NSString
,那么您需要使用[isEqualToString:
]验证
答案 4 :(得分:1)
其他人都给出了正确答案。这是解释。
Objective-C通过将对象放在指针之外来将对象移植到C上。你用NSString *
谈论的不是形式上的字符串,它是指向字符串的指针,即它是字符串所在的内存地址。它描述了字符串的身份,而不是值。
因此,当您使用==
时,您按身份而不是按值进行比较。你问这些两个指针指向一个事物的相同描述吗?"。
你实际上想问一下这些指针末尾的两件事是否具有相同的值?"
您可以使用isEqual:
实现这一点,因为大多数Foundation对象和许多其他对象都实现了该方法,以将其值与参数值进行比较。
(除此之外:身份相等意味着价值相等,但反过来却不是真的;在您自己的代码中实施isEqual:
时,常见的第一个测试是检查身份并且可能返回{{ 1}}没有检查值)