2011-06-16 38 views
0

我正在解析從Web服務返回的XML。如果它是一個有效的用戶,我應該得到一個長整數。 (例如:2110504192344912815或2061128143657912001)。如果它是無效的,那麼我得到一個0.然而,如果你看到我的代碼,我有時得到負值的用戶ID,這是拋出我的驗證代碼乾草線。有小費嗎?爲什麼我在我的NSInteger對象中獲取奇怪的值?

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]; 

    } 
+0

XML數據是什麼樣的? – 2011-06-16 04:11:57

+0

發送'-longLongValue'之前'loginString'的內容是什麼? – 2011-06-16 04:30:38

+1

可能對代碼執行沒有多大影響,但不應該使用%lld來NSLog一個很長的值? – 2011-06-16 05:12:47

回答

4

檢查loginString不等於@"0"

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

編輯:我突出部分意識到,你實際上是問why。那麼,對於NSStringlongLongValue方法的文件說

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中。這絕對會導致溢出。

相關問題