2015-05-20 64 views
1

實際上,我與境界Objective-C的工作分析NSInteger的,這裏是我的問題:境界目標C - 值爲零

我有一個Web服務,其返回此:

{ 
    "id": 1, 
    "name": "Project 1", 
    "summary": "", 
    "description": "description project 1 ...", 
    "amountTargeted": 0, 
    "amountReached": 0, 
    "beginDate": 1432044917000, 
    ... 
    ... 
} 

當我嘗試使用這種方法來分析響應:

[Project createOrUpdateInDefaultRealmWithValue:projectDictionary]; 

我有這樣的錯誤:

'RLMException', reason: 'Invalid value '0' for property 'amountReached'' 

在我的項目,我宣佈的模型amourReached這樣的:

@property NSInteger amountReached; 

我做了一些測試,而這個問題僅出現在值爲零。

我認爲問題都來自於這個方法誰返回false時,它的零:

static inline bool nsnumber_is_like_integer(NSNumber *obj) 
{ 
     const char *data_type = [obj objCType]; 
     // FIXME: Performance optimization - don't use strcmp, use first char in data_type. 
     return (strcmp(data_type, @encode(short)) == 0 || 
     strcmp(data_type, @encode(int)) == 0 || 
     strcmp(data_type, @encode(long)) == 0 || 
     strcmp(data_type, @encode(long long)) == 0 || 
     strcmp(data_type, @encode(unsigned short)) == 0 || 
     strcmp(data_type, @encode(unsigned int)) == 0 || 
     strcmp(data_type, @encode(unsigned long)) == 0 || 
     strcmp(data_type, @encode(unsigned long long)) == 0); 
} 

注:我補充一個斷點,並嘗試一些日誌:

(lldb) p number 
(NSNumber *) $6 = 0x15e76f50 @"0" 
(lldb) po number 
0 
(lldb) p nsnumber_is_like_integer(number)(why ???) 
(bool) $3 = false 
(lldb) p nsnumber_is_like_integer(@0)(Why different of the first ?) 
(bool) $5 = true 
(lldb) p nsnumber_is_like_integer(@1) 
(bool) $4 = true 

在此先感謝,如果您有任何想法,是我的代碼領域問題還是問題?

+0

是否有可能數字實際上是一個字符串?你還可以'p obj.objCType'? – segiddins

+0

我可以不記錄「p obj.objCType」,因爲它是一個id,但我的第一個日誌顯示該對象是一個NSNumber。((NSNumber *)$ 6 = 0x15e76f50 @「0」)我試圖記錄po [obj類],結果是__NSCFNumber – Hikosei

回答

0

我發現瞭解決方案,我將NSInteger的類型改爲了兩倍,並且知道每件事情都可以。

@property NSInteger amountReached; //Old way 
@property double amountReached; //Working way 

我不知道這是正常的,對我來說這應該是確定與NSInteger的,如果有人作爲解釋:)。

+0

有沒有什麼辦法可以共享一些示例代碼,這將允許我們重現該問題?NSInteger'應該可以在這種情況下工作,從上面的註釋看來,它好像是一個帶有值爲零,這應該是有效的 – jpsim

+0

我認爲問題來自我的json序列化程序,零有一個NSDecimalNumber類,所以它是邏輯的,它不能是一個int。現在我必須找到它爲什麼是一個NSDecimalNumber而不是一個NSCFNumber。 – Hikosei