【问题标题】:Strange Behavior when making comparisons比较时的奇怪行为
【发布时间】:2012-01-07 10:42:26
【问题描述】:

我有一个函数,用于通过检查特定属性是否等于大型数据数组中许多对象的特定值来构造数组。数据数组已完全初始化,但我无法从中检索任何对象。当我浏览代码时,XCode 告诉我下面的“事物”变量超出了范围。

这是由于我的功能导致的错误还是数据数组的问题? (我独立检查了数据数组,它得到了正确的计数和正确的成员)。

- (NSMutableArray *)parseForProperty:(NSString*)property EqualTo:(NSString*)value

{
    NSMutableArray *result = [[NSMutableArray alloc] init];

    SEL selector = NSSelectorFromString(property); 

    NSLog(@"parseProp");

    for (RCDetailItem *thing in [[self defaultStore] parsedData]) 
    {
        NSLog(@"Thing Title: %@", thing.title);
        if ([thing performSelector:selector] == value) 
        {
            [result addObject:thing];
        }
    }
    return result;
}

【问题讨论】:

    标签: objective-c ios nsmutablearray selector


    【解决方案1】:

    目前,您不比较字符串而是参考。 你可以试试:

    NSString * thingProperty = [thing performSelector:selector];
     if ([thingProperty isEqualToString:value])
    ..
    

    但我确信它会解决,因为您指的是“下面的变量超出范围”。是编译错误吗?

    【讨论】:

    【解决方案2】:
    1. @Arnaud del 是对的,Objective C 对象不能通过比较指向它们的指针来进行比较(不同的实例显然具有不同的指针值,即使它们具有相同的值)。您应该使用-isEqual: 消息按值比较它们。

    2. Variable below is out of scope 调试器消息通常是由编译器设置中启用的代码优化引起的,因此您的变量被编译器隐式清除,调试器没有机会显示它的值。

      确保您正在调试 Debug 配置,并且通过将 Optimization Level 设置为 None 来关闭优化。

    【讨论】: