2014-07-07 74 views
0

在文件RKMappingOperation有方法Restkit:methodSignatureForSelector在RKMappingOperation崩潰與EXC_BAD_ACCESS

- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector 
{ 
    return [self.object methodSignatureForSelector:selector]; 
} 

觸發對iPhone5的異常,但應用程序繼續運行。但是在iPhone4S上,應用程序與EXC_BAD_ACCESS一起崩潰。

enter image description here enter image description here

我假設如文檔中規定的異常處理:

引發NSInvalidArgumentException。在您的具體子類中重寫此方法,以便爲給定的選擇器和您的代理對象所代表的類返回適當的NSMethodSignature對象。

日誌文件:

T restkit.object_mapping:RKMappingOperation.m:862 Performing mapping operation: <RKMappingOperation 0x181e1960> for 'TSNDecimal' object. Mapping values from object 10 to object <TSNDecimal: 0x18004bc0> (entity: TSNDecimal; id: 0x1819dcb0 <x-coredata:///TSNDecimal/t507A4693-CB2E-4194-966A-00BA8AD5CC70391> ; 
    data: { 
    number = 0; 
    responseName = nil; 
    sortId = 0; 
    ticket = nil; 
}) with object mapping (null) 
2014-07-07 13:17:50.194 VZN Mobile[440:8f0f] D restkit.object_mapping:RKPropertyInspector.m:131 Cached property inspection for Class 'TSNDecimal': { 
number =  { 
    isPrimitive = 0; 
    keyValueCodingClass = NSDecimalNumber; 
    name = number; 
}; 
responseName =  { 
    isPrimitive = 0; 
    keyValueCodingClass = NSString; 
    name = responseName; 
}; 
sortId =  { 
    isPrimitive = 0; 
    keyValueCodingClass = NSNumber; 
    name = sortId; 
}; 
sortIdValue =  { 
    isPrimitive = 1; 
    keyValueCodingClass = NSNumber; 
    name = sortIdValue; 
}; 
ticket =  { 
    isPrimitive = 0; 
    keyValueCodingClass = TSNTicketApiTO; 
    name = ticket; 
}; 

} 2014年7月7日13:17:50.194 VZN移動[440:9f07] T,restkit.object_mapping:RKMappingOperation.m:在440的keyPath實測值變形'(空值)'。從'__NSCFNumber'類轉換爲'NSDecimalNumber' 2014-07-07 13:17:50.204 VZN Mobile [440:9f07] self.object:10

+0

顯示導致異常的映射和JSON。 – Wain

回答

0

謝謝Wain的評論。實際上它是由Restkit將NSDecimalNumber轉換爲NSNumber中的錯誤代碼引起的。有一種方法RKValueTransformers.m:

+ (instancetype)decimalNumberToNumberValueTransformer 
{ 
    .... 
    .... 
    RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSNumber class], [NSDecimalNumber class]]), error); 
    if ([inputValue isKindOfClass:[NSNumber class]]) { 
     *outputValue = [NSDecimalNumber decimalNumberWithDecimal:[inputValue decimalValue]]; 
    } else if ([inputValue isKindOfClass:[NSDecimalNumber class]]) { 
     *outputValue = inputValue; 
    } 
    return YES; 
}]; 
} 

的條件必須換這種方式:

if ([inputValue isKindOfClass:[NSDecimalNumber class]]) { 
     *outputValue = [NSDecimalNumber decimalNumberWithDecimal:[inputValue decimalValue]]; 
    } else if ([inputValue isKindOfClass:[NSNumber class]]) { 
     *outputValue = inputValue; 
    } 

然後代碼沒有崩潰,它正在工作,筆者最初設想。

+0

您的修正看起來並不完全正確/一致(一個分支返回'NSNumber',另一個返回'NSDecimalNumber'),如果您還沒有這樣做,您應該在github上提出一個錯誤報告 – Wain

+0

您是對的。我也暫停了這一點。但是我很滿意,因爲NSDecimalNumber是NSNumber的子類。 –