核心数据错误 - 'NSInvalidArgumentException',原因:'*** -objCType仅为抽象类定义。定义 - [FormatNumber objCType]!'

时间:2013-01-13 05:31:58

标签: iphone objective-c ios6 xcode4.5

使用我的应用时出现此错误。这是一个简单的计算器,当我按下一个数字时会发生这种情况:

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;

2 个答案:

答案 0 :(得分:1)

我认为这不是核心数据问题。

尝试避免子类化NSNumber并改为使用类别。

您可以查看here例如

答案 1 :(得分:1)

这与核心数据无关。您已将NSNumber子类化,但未遵循NSNumber documentation中列出的规则:

  

与任何类集群一样,如果您创建NSNumber的子类,则为   必须覆盖其超类NSValue的原始方法。   此外,还有一组受限制的返回值   执行NSValue方法objCType可以返回,以便   利用非原始的抽象实现   方法。有效的返回值是“c”,“C”,“s”,“S”,“i”,“I”,   “l”,“L”,“q”,“Q”,“f”和“d”。

如果您进行子类化的唯一原因是实现getNumber:方法,则应使用Objective-C类别。

NSNumber+MyCategoryName.h

@interface NSNumber (MyCategoryName)

- (NSString *)getNumberAsString:(float)n1;

@end

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: