2012-05-04 2 views
2

У меня есть проект, который выполняет несколько сетевых операций. Для удобства управления я дал каждой операции уникальный идентификатор, определяемый как NSNumber, потому что я должен выполнять операции с объектами и массивом и проще этот путь:Iphone sdk - странное поведение при сравнении NSNumber

#define LOGIN_OPERATION      [NSNumber numberWithInt:0] 
#define REGISTER_USER_OPERATION    [NSNumber numberWithInt:1] 
#define VERIFY_USER_OPERATION    [NSNumber numberWithInt:2] 
#define REGISTER_USER_DATA_OPERATION  [NSNumber numberWithInt:3] 
#define FORGOT_PASSWORD_OPERATION   [NSNumber numberWithInt:4] 
#define PASSTIME_REGISTER_OPERATION   [NSNumber numberWithInt:5] 
#define PASSTIME_VERIFY_TOKEN_OPERATION  [NSNumber numberWithInt:6] 
#define PASSTIME_OPERATION     [NSNumber numberWithInt:7] 
#define SERVICES_OPERATION     [NSNumber numberWithInt:8] 
#define MAIL_SUPPORT_OPERATION    [NSNumber numberWithInt:9] 
#define UPDATE_USER_INFO_OPERATION   [NSNumber numberWithInt:10] 
#define OBTAIN_CACS_OPERATION    [NSNumber numberWithInt:11] 
#define GET_PREPAID_BALANCE_OPERATION  [NSNumber numberWithInt:12] 
#define UPDATE_SERVICES_OPERATION   [NSNumber numberWithInt:13] 

тогда я просто использовал среди моих инструкций проекта в следующих , который неплохо поработал в течение прошлого года.

- (void) processNetworkResponseForOperation: (NSNumber*) opId { 

    if (opId == SERVICES_OPERATION) { 
     //do something 
    } else if (opId == UPDATE_SERVICES_OPERATION) { 
     //do something 
    } 

} 

Однако сегодня я добавил последнюю операцию (номер 13) и все операции == результата ложно, только с этим номером !, я использовал отладчик, чтобы гарантировать, что значение нормально, но я могу только получите условие true, если я использую: [opId isEqualToNumber: UPDATE_SERVICES_OPERATION], который довольно длинный.

Я понимаю, что NSNumber является объектом, и, следовательно, == может быть не лучшим выбором, но почему он работает со всеми другими операциями между проектом, но с # 13 не работает?

Любая помощь будет оценена по достоинству.

Редактировать Ну я пытался с большими числами и у меня такая же проблема, но, например, если я включаю номер theUPDATE_SERVICES_OPERATION с другим номером оп, теперь он делает UPDATE_SERVICES_OPERATION, но он не будет делать операцию, которую я переключил номер , Итак, почему он не работает с новыми номерами: S, или это просто проблема сборки на xcode? (я перезагружаюсь и обновляюсь)

ответ

11

Вы не должны сравнивать NSNumber прямо как вы здесь, потому что это объект, а не простой тип. Ваш текущий код зависит от равенства адресов памяти объектов, а не от их значения. Читайте здесь для получения дополнительной информации Comparing objects in Obj-C.

Вы не должны использовать == для сравнения для равенства объектов, а вместо этого функцию isEqual: на NSObject и обычно только в том случае, если вы хотите быть уверенным, что объекты, которые вы сравниваете, являются одним и тем же экземпляром. Следующий код должен исправить вашу проблему.


- (void) processNetworkResponseForOperation: (NSNumber*) opId { 

    if ([opId intValue] == [SERVICES_OPERATION intValue]) { 
     //do something 
    } else if ([opId intValue] == [UPDATE_SERVICES_OPERATION intValue]) { 
     //do something 
    } 

} 
+0

Согласен, вот как это должно быть сделано. Но для меня вопрос все еще открыт ... почему меняется поведение? Я попытался выяснить это сам, но еще не понял. –

+0

@ C4 - Трэвис, если вы прочтете ответ на этот вопрос http://stackoverflow.com/questions/5054730/comparing-objects-in-obj-c, вы увидите, что в коде, который оп размещен, сравнивается адрес памяти объекты. Есть много причин, по которым другие ценности могут работать, в то время как последнее не имеет значения, но шансы на то, что все это непоследовательно. Нам понадобится вся база кода для дальнейшего анализа. –

+0

круто, спасибо dave –

Смежные вопросы