2011-11-16 84 views
3

我會因爲這個bug而變得瘋狂! 我有這樣的一段代碼,如果我做的iOS 4.3iOS 5 NSNumber Bug

newRegistered.ticket_id = [NSNumber numberWithInt: 
[curRegistered objectForKey:@"ticket_id"] intValue]]; 

效果很好:

NSLog(@"ID before : %d, ID after : %d", 
[curRegistered objectForKey:@"ticket_id"] intValue], [newRegistered.ticket_id intValue]); 

我在iOS 4.3有:

ID前:經過35459 ID :35459

而在iOS 5.0上:

ID前:35459,編號:-30077

請幫幫忙! 謝謝你的提前。

##編輯︰## 我已經調查了更多的問題。看來問題來自在CoreData中分配NSNumber。我應該指定上面的代碼片段與CoreData一起使用(newRegistered是一個NSManagedObject,curRegistered是一個包含JSON數據的NSDictionary(只有字符串,從不是int或long ...))。

下面是具體的問題:

long long test = 789654; 

Registereds *a = [NSEntityDescription insertNewObjectForEntityForName:@"Registereds" inManagedObjectContext:self.managedObjectContext]; 
a.ticket_id = [NSNumber numberWithLongLong:test]; 
NSLog(@"%lld -> %@", test, a.ticket_id); // Displays 789654 -> 3222 on iOS 5 and 789654 -> 789654 on iOS 4.3 

NSNumber *ticket_id = [NSNumber numberWithLongLong:test]; 
NSLog(@"%lld -> %@", test, ticket_id); // Displays 789654 -> 789654 

如此看來問題來自於Registereds對象(這是一個NSManagedObject,像newRegistered在前面的例子)。

你知道爲什麼會發生這種情況嗎?我從來沒有見過這樣的事情在2年以上的編碼,這個錯誤真的讓我覺得我不知道如何代碼...

+0

您可以嘗試使用'[NSNumber numberWithLong:...'來進一步調查問題。 – dasdom

+0

它是模擬器/設備嗎? – debleek63

+0

您應該打印'[curRegistered objectForKey:@「ticket_id」]'的「raw」值以查看是否存在任何古怪的字符。 –

回答

5

一個暗示:789654截斷爲16位是3222

我試圖複製你的問題與iOS 5.我可以得到NSLog(@"%lld -> %@", test, a.ticket_id)顯示'789654 - > 3222'的唯一方法是如果我將ticket_id屬性類型設置爲Integer 16。如果我將其設置爲Integer 32Integer 64,則會顯示預期值。

在數據模型編輯器中檢查ticket_id的屬性類型。因爲您使用的是long long,我認爲它應該設置爲Integer 64。從你展示的內容我會懷疑它設置爲Integer 16。如果不是,則該值在其他地方被截斷爲16位。

+0

非常感謝,就是這樣...我只是想知道爲什麼它在iOS 4.3上工作...讓我們認爲Int 16/32/64沒有任何效果... – THClem

+0

iOS 5可能更嚴格關於強制內存中的屬性類型,而4.3是讓它滑落。我敢打賭,即使在數據被實際保存到Sqlite數據庫時,它也會被截斷。 –