0

アプリを使用しているときにこのエラーが発生します。これは単純な電卓で、数字を押すと発生します。

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;
4

2 に答える 2

1

これは Core Data の問題ではないと思います。

NSNumber のサブクラス化を避け、代わりにカテゴリを使用してください。

たとえば、ここを見ることができます

于 2013-01-13T06:05:39.467 に答える
1

これは Core Data とは関係ありません。サブクラス化しましたが、 NSNumber のドキュメントNSNumberに記載されている規則に従っていません。

他のクラス クラスタと同様に、NSNumber のサブクラスを作成する場合は、そのスーパークラスである NSValue のプリミティブ メソッドをオーバーライドする必要があります。さらに、非プリミティブ メソッドの抽象実装を利用するために、NSValue メソッド objCType の実装が返すことができる制限付きの戻り値のセットがあります。有効な戻り値は、「c」、「C」、「s」、「S」、「i」、「I」、「l」、「L」、「q」、「Q」、「f」、および「ド」。

サブクラス化した唯一の理由がその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

しかし、この方法を のカテゴリに入れるのは得策ではないと思いますNSNumberNSNumberFormatterおそらく、 のクラスメソッドであることがわかりました。最後に、このメソッドを呼び出すことは命名規則に違反していますgetNumber:。で始まるメソッドgetは、通常、引数として渡された参照を通じて複数の値を返すメソッド用に予約されています。という名前の方がいいかもしれません-max2FractionDigits:

于 2013-01-13T08:27:54.953 に答える