ios objective-c autorelease

ios - ¿Hay una manera de crear un NSDecimal sin usar NSNumber y crear objetos lanzados automáticamente?



objective-c autorelease (2)

Desafortunadamente, Apple no proporciona ninguna manera fácil de poner valores en una estructura NSDecimal. La propia definición de estructura se puede encontrar en el encabezado 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;

pero no sé si trataría de hacer ingeniería inversa de cómo las estructuras mantienen los valores. Los guiones bajos en los campos en la estructura indican que estos son privados y están sujetos a cambios. No me imagino que ocurran muchos cambios en las funciones mínimas de la función NSDecimal, pero en algún momento estaría nervioso por las cosas que se rompen.

Dado que, la inicialización de un NSDecimal a partir de un número de punto flotante se realiza mejor de la manera que describe. Sin embargo, tenga en cuenta que cada vez que use un valor de punto flotante, estará perdiendo la precisión que ganó al usar un NSDecimal y estará sujeto a errores de punto flotante.

Siempre trabajo solo con NSDecimals en mis cálculos de alta precisión, y admito y exporto NSStrings para intercambiar estos valores con el mundo exterior. Para crear un NSDecimal basado en una NSString, puede utilizar el enfoque que adoptamos en el marco Core Plot :

NSDecimal CPDecimalFromString(NSString *stringRepresentation) { NSDecimal result; NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation]; [theScanner scanDecimal:&result]; [theScanner release]; return result; }

Usar un NSScanner en lugar de NSDecimalNumber -initWithString:locale: es aproximadamente un 90% más rápido en mis puntos de referencia.

Estoy realizando una serie de cálculos utilizando NSDecimal y estoy creando cada estructura NSDecimal utilizando la siguiente técnica:

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

Estoy utilizando NSDecimal para evitar el uso de objetos NSDecimalNumber publicados NSDecimalNumber (si se NSDecimalNumber método NSDecimalNumber para realizar cálculos precisos). Sin embargo, parece que el mecanismo de creación de NSNumber también devuelve un NSNumber NSNumber del cual se extrae el valor decimal.

¿Hay una manera de crear un NSDecimal sin usar NSNumber y crear objetos lanzados automáticamente?


Para responder a la parte "sin objetos lanzados automáticamente" , simplemente:

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