2010-11-26 12 views
0

Meine app ist mir zu sagen, dass ich über-Releasing unter der NSDecimalNumber tempDouble:über Freigabe eine NSDecimalNumber

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

Ich denke, dass das Problem Linie dies ist:

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

Aber ich bin mir nicht sicher warum. Sollte ich nach der Zuweisung ein Attribut "zuweisen, kopieren oder behalten" hinzufügen? Wenn ich die unten stehende "Release" -Anweisung loslasse, funktioniert der Code einwandfrei.

Danke,

G

+0

Welche Sprache ist das? Bitte sagen Sie mir, dass ich sein Tag ignorieren kann. –

Antwort

0

Das Problem ist in der Tat in dieser Zeile:

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

Was Sie hier tun, den vorherigen Wert in tempDouble ersetzt (die eine Zählung behalten hat von 1) mit einem neuen Wert (der automatisch freigegeben wird).

Hier ist der richtige Weg, es zu tun:

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

Und dann die [tempDouble release] vom Ende des Verfahrens löschen.

Verwandte Themen