Почему я получаю странные значения в моем объекте NSInteger? - PullRequest
0 голосов
/ 16 июня 2011

Я анализирую XML, который возвращается из веб-службы. Если это действительный пользователь, я должен получить длинное целое число. (например: 2110504192344912815 или 2061128143657912001). Если он недействителен, я получаю 0. Однако, если вы видите мой код, я иногда получаю отрицательные значения для userID, и это приводит к сбою моего кода проверки. Любые советы?

NSMutableString *loginString;
    NSInteger userID;

-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *) elementName
 namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName{

    if ([elementName isEqual:@"GetUIDResult"]) {        
        userID = [loginString longLongValue]; / 0 if invalid password or LONG 
        [loginString release];
        loginString = nil;
    }   

}


//MY VALIDATION CODE..

    NSLog(@"The value of userID is: %ld",userID);

    if (userID > 0) {

    NSLog(@"YOU ARE NOW LOGGED IN");

    }else {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login Validation Error" message:@"Unable to validate Login/Password combination" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
        [alert show];
        [alert release];

    }

1 Ответ

4 голосов
/ 16 июня 2011

проверить, не совпадает ли loginString с @"0"

if (![loginString isEqualToString:@"0"]) {
       NSLog(@"YOU ARE NOW LOGGED IN");
}

РЕДАКТИРОВАТЬ: Я просто понял, что вы на самом деле спрашиваете why. Ну, документация для NSString longLongValue методов гласит

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/doc/uid/20000154-intValue

Возвращаемое значение Длинное длинное значение текст получателя, предполагая десятичное представление и пропуск пробелы в начале строка. Возвращает LLONG_MAX или LLONG_MIN на переполнении. Возвращает 0, если получатель не начинается с действительного десятичного числа текстовое представление числа.

Итак, что происходит, так это то, что значение loginString является переполнением, либо потому, что вы получаете его таким образом, либо неправильно анализируете его.

РЕДАКТИРОВАТЬ 2:

Я видел, что вы редактировали свой код. Теперь вы пытаетесь сохранить длинное длинное значение в переменной типа NSInteger: userID. Это определенно вызовет переполнение.

...