“如果”陈述谜

时间:2014-04-29 05:39:06

标签: ios objective-c if-statement

我有一个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)

现在它完美无缺!有趣的是,我在一段时间之前遇到了同样的问题,并且实际上曾尝试更改代码,但这次我显然做错了什么,让我觉得这是错误的做法。

非常感谢!

5 个答案:

答案 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}}没有检查值)