2014-07-07 76 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的子类。 –