核心数据错误 - "NSInvalidArgumentException",原因:'*** -objCType only defined for abstract class. Define -[F



我在使用我的应用程序时得到这个错误。这是一个简单的计算器,当我按下一个数字时发生:

2013-01-12 21:13:32.175 Basic Calc[1683:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***
-objCType only defined for abstract class.  Define -[FormatNumber objCType]!'
*** First throw call stack: (0x1c8f012 0x10cce7e 0x1c8edeb 0xb96f35 0xba6b3f 0xb1a049 0xac8fc5 0x1c09ac6 0x1c4f13c 0xac8f60 0xac8eab 0x2b4b 0x10e0705 0x17920 0x178b8 0xd8671 0xd8bcf 0xd7872 0x4716d 0x47552 0x253aa 0x16cf8 0x1beadf9 0x1beaad0 0x1c04bf5 0x1c04962 0x1c35bb6 0x1c34f44 0x1c34e1b 0x1be97e3 0x1be9668 0x1465c 0x27cd 0x26f5) libc++abi.dylib: terminate called throwing an exception

这是我的代码的一部分:

MainViewController.m

currentNumber = currentNumber *10 + (float)[sender tag]; 
FormatNumber *convertedNumber;
convertedNumber = [[FormatNumber alloc] init];
[convertedNumber getNumber:currentNumber];
calculatorScreen.text = [NSString stringWithFormat:@"%@",convertedNumber];

FormatNumber.m

@interface FormatNumber: NSNumber
{
    NSString *nf;
}
-(NSString *) getNumber:(float)n1;
@end

FormatNumber.m

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:2];
[formatter setMinimumFractionDigits:0];
nf = [formatter stringFromNumber:[NSNumber numberWithFloat: n1]];
return nf;

同样,当我得到错误时,代码指向main.m中的这一行:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

任何想法?


新代码:

MainViewController.h

currentNumber = currentNumber *10 + (float)[sender tag];
NSNumber *convertedNumber = [[NSNumber alloc] init];
NSString *finalValue = [convertedNumber customFormatNumber:currentNumber];
calculatorScreen.text = [NSString stringWithFormat:@"%@",finalValue];

NSNumber + FormatNumber.h

@interface NSNumber (FormatNumber)
-(NSString *) customFormatNumber:(float)n1;
@end

NSNumber + FormatNumber.m

@implementation NSNumber(FormatNumber)
-(NSString *) customFormatNumber:(float)n1
{
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setMaximumFractionDigits:2];
        [formatter setMinimumFractionDigits:0];
        NSString *nf = [formatter stringFromNumber:[NSNumber numberWithFloat:n1]];
        return nf;

我认为这不是Core Data的问题。

尽量避免子类化NSNumber,而使用category。

你可以在这里查看例如

这与Core Data无关。你已经子类化了NSNumber,但没有遵循NSNumber文档中列出的规则:

与任何类簇一样,如果你创建NSNumber的一个子类,你就可以必须重写它的父类NSValue的基本方法。此外,还存在一组受限制的返回值实现NSValue方法objCType可以返回,为了利用非原语的抽象实现方法。有效的返回值是"c","c","s"、"s","我","我"," l ", " l ", " q ", " q ", " f ",和" d "

如果你子类化的唯一原因是实现getNumber:方法,你应该使用Objective-C Category。

In NSNumber+MyCategoryName.h:

@interface NSNumber (MyCategoryName)
- (NSString *)getNumberAsString:(float)n1;
@end

In NSNumber+MyCategoryName.m

@implementation NSNumber (MyCategoryName)
- (NSString *)getNumberAsString:(float)n1
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:2];
    [formatter setMinimumFractionDigits:0];
    NSString *nf = [formatter stringFromNumber:[NSNumber numberWithFloat: n1]];
    return nf;
}
@end

然而,我不认为这是一个好主意,把这个方法作为NSNumber的一个类别。我可以看到它是NSNumberFormatter上的一个类方法,也许。最后,将此方法称为getNumber:是违反命名规则的;以get开头的方法通常用于通过作为参数传递的引用返回多个值的方法。也许-max2FractionDigits:更合适。

相关内容

最新更新