2

私はいつもNSDecimalNumberで問題にぶつかるようです!今日、私はこのエラーを受け取ります:

"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFNumber decimalNumberByDividingBy:withBehavior:]: unrecognized selector sent to instance 0xd1fb10'"

エラーの原因は次のとおりです。

- (void)setUpInstance {
    static NSDecimalNumberHandler* roundingBehavior = nil;
    if (roundingBehavior == nil) {
        roundingBehavior = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
    }   
    NSDecimalNumber *amount = viewController.aDecimalNumber;
    NSDecimalNumber *actualValue = viewController.anotherDecimalNumber;
    integralPortion = [amount decimalNumberByDividingBy:actualValue withBehavior:roundingBehavior];
    ...
}

ドキュメントでは、メソッドを次のように定義しています。

-(NSDecimalNumber*)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber
                                withBehavior:(id<NSDecimalNumberBehaviors>)behavior

(id<NSDecimalNumberBehaviors>)behavior" "引数を正しく解釈してはいけません。NSDecimalNumbersBehaviorsプロトコルに準拠している限り、それは単なるオブジェクトではありませんか?

私は何を間違っているのですか?コード例は非常に役立ちます。

ハッピー・フライデー!

4

1 に答える 1

3

今日、次のエラーが発生します:「キャッチされない例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:' ***-[NSCFNumber decimalNumberByDividingBy:withBehavior:]:認識されないセレクターがインスタンス0xd1fb10に送信されました'」

つまり、そのメッセージをプレーンなNSNumber(舞台裏のNSCFNumber)に送信しているということです。NSDecimalNumberにのみ送信できます。

変数の宣言方法は関係ないことに注意してください。amountとして宣言するNSString *amountと、実行時に発生する例外であるため、クラス名としてNSCFNumberを含め、まったく同じ例外が発生します。(もちろん、NSStringとNSDecimalNumberが互換性がないことについてのコンパイル時の警告も表示されます。)

于 2009-07-25T01:16:56.023 に答える