Y at-il un moyen de créer un NSDecimal sans utiliser NSNumber et créer des objects auto-libérés?

NSDecimal un certain nombre de calculs en utilisant NSDecimal et je crée chaque structure NSDecimal utilisant la technique suivante:

 [[NSNumber numberWithFloat:kFloatConstant] decimalValue] 

J'utilise NSDecimal pour éviter d'utiliser des objects NSDecimalNumber NSDecimalNumber (si l'approche NSDecimalNumber pour des calculs précis est utilisée). Cependant, il semble que le mécanisme de création NSNumber renvoie également un NSNumber NSNumber partir duquel la valeur décimale est extraite.

Y at-il un moyen de créer un NSDecimal sans utiliser NSNumber et créer des objects auto-libérés?

Malheureusement, Apple ne fournit aucun moyen facile de mettre des valeurs dans une structure NSDecimal. La définition de structure elle-même peut être trouvée dans l'en-tête NSDecimal.h:

 typedef struct { signed int _exponent:8; unsigned int _length:4; // length == 0 && isNegative -> NaN unsigned int _isNegative:1; unsigned int _isCompact:1; unsigned int _reserved:18; unsigned short _mantissa[NSDecimalMaxSize]; } NSDecimal; 

mais je ne sais pas si j'essaierais d'inverser la façon dont les structures contiennent des valeurs. Les traits de soulignement sur les champs dans la structure indiquent que ceux-ci sont privés et sujets à changement. Je n'imagine pas que beaucoup de changements se produisent dans les fonctions NSDecimal de bas niveau, mais je serais nerveux à propos des choses qui se cassent à un moment donné.

Étant donné que l'initialisation d'un NSDecimal à partir d'un nombre à floating point est mieux fait de la manière que vous décrivez. Cependant, sachez que chaque fois que vous utilisez une valeur à floating point, vous perdez la précision que vous avez acquise en utilisant un NSDecimal et vous vous soumettez à des erreurs à floating point.

Je travaille toujours uniquement avec NSDecimals dans mes calculs de haute précision, et je prends et exporte NSSsortingngs pour échanger ces valeurs avec le monde extérieur. Pour créer un NSDecimal basé sur un NSSsortingng, vous pouvez utiliser l'approche que nous prenons dans la structure du Core Plot :

 NSDecimal CPDecimalFromSsortingng(NSSsortingng *ssortingngRepresentation) { NSDecimal result; NSScanner *theScanner = [[NSScanner alloc] initWithSsortingng:ssortingngRepresentation]; [theScanner scanDecimal:&result]; [theScanner release]; return result; } 

Utiliser un NSScanner au lieu de NSDecimalNumber -initWithSsortingng:locale: est environ 90% plus rapide dans mes tests.

Pour répondre à la partie "sans objects autoreleased" , il suffit de:

 NSDecimalNumber *intermediateNumber = [[NSDecimalNumber alloc] initWithFloat:kFloatConstant]; NSDecimal decimal = [intermediateNumber decimalValue]; [intermediateNumber release];