0

私のアプリは、以下の NSDecimalNumber tempDouble を過剰に解放していると言っています:

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
        [currencyFormatter setLocale:[NSLocale currentLocale]];
        [currencyFormatter setGeneratesDecimalNumbers:TRUE];
        [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

        // Here is the key: use the maximum fractional digits of the currency as the scale
        int currencyScale = [currencyFormatter maximumFractionDigits];

        NSDecimalNumber* tempDouble = [[NSDecimalNumber alloc] initWithString:self.tempStore];


        NSDecimalNumber* numTen = [[NSDecimalNumber alloc] initWithInt:10];

        tempDouble = [tempDouble decimalNumberByDividingBy:[numTen decimalNumberByRaisingToPower:currencyScale]];

        [numTen release];


        [textField setText:[currencyFormatter stringFromNumber:tempDouble]];

        [currencyFormatter release];
        [tempDouble release];

問題の行はこれだと思います:

tempDouble = [tempDouble decimalNumberByDividingBy:[numTen decimalNumberByRaisingToPower:currencyScale]];

しかし、理由はわかりません。割り当ての後に「割り当て、コピー、または保持」属性を追加する必要がありますか? 以下の「リリース」ステートメントを取り除くと、コードは正常に機能します。

ありがとう、

G

4

1 に答える 1

0

問題は実際には次の行にあります。

tempDouble = [tempDouble decimalNumberByDividingBy:[numTen decimalNumberByRaisingToPower:currencyScale]];

ここで行っているのは、tempDouble の以前の値 (保持カウントが 1) を新しい値 (自動解放される) に置き換えることです。

これを行う正しい方法は次のとおりです。

NSDecimalNumber* tempDouble = [[[NSDecimalNumber alloc] initWithString:self.tempStore] autorelease];

そして[tempDouble release]、メソッドの末尾から を削除します。

于 2010-11-26T21:41:00.020 に答える