2009-07-25 12 views
1

私はいつもNSDecimalNumberに問題があるようです!今日、私はこのエラーを取得する:NSDecimalNumberのdecimalNumberByDividingByに関する問題:withBehavior:

ここ

"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プロトコルに準拠している限り、それはただのオブジェクトではありませんか?

私は間違っていますか?コード例はと非常にとなります。

ハッピーフライデー!

答えて

3

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

つまり、NSNumber(NSCF Number of the scenes)にそのメッセージを送信しています。 NSDecimalNumberにのみ送ることができます。

変数を宣言する方法は無関係です。 amountNSString *amountと宣言すると、実行時に発生する例外であるため、NSCFNumberをクラス名として使用する場合とまったく同じ例外が発生します。 (もちろん、コンパイル時に NSStringとNSDecimalNumberについて交換可能でないことを警告する)

+0

NSDecimalNumberで作業していることを確認するにはどうすればよいですか? – Meltemi

+0

viewControllerは作成したクラスですか?もしそうなら、aDecimalNumberがNSDecimalNumberを返すことを確認します(もしそうなら)。それ以外の場合は、decimalNumberWithMantissa:exponent:isNegative:を使用して、取得している値からNSDecimalNumberを作成し、それを処理します。 – smorgan

+0

Meltemi:単純にNSNumberをView Controllerの 'aDecimalNumber'プロパティに割り当てないでください。値を保存して復元する場合は、その格納形式の文字列表現を使用します。 (プロパティリストへのセーブは*機能しません。なぜなら、セーブして復元するのはプレーンなNSNumberのようになり、結果として精度が失われるからです。) –