Странное поведение при сравнении - PullRequest
0 голосов
/ 07 января 2012

У меня есть функция, которую я использую для создания массива, проверяя, равно ли конкретное свойство определенному значению объекта среди множества в большом массиве данных. Массив данных полностью инициализирован, но я не могу извлечь из него никаких объектов. Когда я просматриваю код, 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;
}

Ответы [ 2 ]

2 голосов
/ 07 января 2012
  1. @ Арно дель прав, объекты Objective C нельзя сравнивать, сравнивая с ними указатели (разные экземпляры, очевидно, имеют разные значения указателя, даже если они имеют одинаковое значение). Вы должны использовать -isEqual: сообщение, чтобы сравнить их по значению.

  2. Variable below is out of scope сообщение отладчика часто вызывается оптимизацией кода, включенной в настройках компилятора, поэтому ваша переменная неявно стирается компилятором, и у отладчика нет шансов показать его значение.

    Убедитесь, что вы отлаживаете конфигурацию Отладка и у вас отключены оптимизации, для параметра Уровень оптимизации установлено значение Нет.

2 голосов
/ 07 января 2012

В настоящее время вы сравниваете не строки, а ссылки. Вы можете попробовать:

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

Но я уверен, что это разрешится, потому что вы ссылаетесь на "переменная ниже находится вне области видимости". Это ошибка компиляции?

...