NSNumber numberWithFloat vs Init y alloc

Tengo esta línea de código y estoy tratando de descubrir los pros y los contras de la forma en que lo escribí. Solo trato de establecer una label para un valor flotante y ambos funcionan … simplemente no sé cuál es mejor …

self.display.text=[[NSNumber numberWithFloat:32.445] stringValue]; 

¿Hay alguna diferencia para decir?

 NSNumber *number = [[NSNumber alloc]initWithFloat:32.445]; self.display.text = [number stringValue]; 

Bueno, sé que debe haber una diferencia, simplemente no estoy seguro de lo que sería. Parece que el primero es más un envoltorio (si eso tiene sentido)?

¡¡¡Gracias!!!

 [NSNumber numberWithFloat:32.445] 

es equivalente a:

 [[[NSNumber alloc] initWithFloat:32.445] autorelease] 

en el modo de recuento manual de reference. En el modo ARC o GC, puede considerarlo equivalente a:

 [[NSNumber alloc] initWithFloat:32.445] 

El único beneficio que probablemente pueda get es intentar evitar la llamada de autorelease en el modo MRC y replacelo con una llamada de release .

Parece que el primero es más un envoltorio (si eso tiene sentido)?

Eso es exactamente lo que es en la mayoría de las implementaciones, y prohibir los casos de esquina = p Se llama un constructor de conveniencia.

En cuanto a lo que debería preferir, lo que sea más claro para usted. Prefiero alloc + init porque es más fácil administrar la memory y requiere un poco less de sobrecarga (aparte de los casos de esquina).

Si sabe que tiene muchos objects para hacer o que está escribiendo código crítico de performance / memory ( tos dispositivos iOS), entonces debería considerar preferir alloc + init para su código 'más pesado'.

El número de numberWithFloat: selector llama a un método de class en NSNumber (al igual que un método estático de Java, C # o C ++). El initWithFloat: selector llama a un método de instancia en un object NSNumber específico. Utiliza [NSNumber alloc] para que la instancia inicie.

(Consulte los documentos de Apple para get más información).

Definitivamente es justo pensar en el método estático como un contenedor para la segunda forma, porque alguien debe llamar a alloc .

A less que se esté ejecutando bajo ARC, necesita [número de versión] en este último caso. Para un uso único, entonces, el primer caso – usando + numberWithFloat: – probablemente sea preferible (less tipeo = less errores, código más claro).

La única diferencia real que puedo pensar es que si estás usando estos en ciertas aplicaciones críticas para el performance, especialmente en lo que respecta a los loops, hay consideraciones de optimization de memory más complejas al decidir si usar methods de class o instancia. Estos, sin embargo, en realidad no se aplican aquí (presumiblemente se trata de un código UI), así que simplemente simplifique su vida y use + numberWithFloat :.

Si estás trabajando con ARC , entonces supongo que las dos forms son las mismas.

Si está trabajando sin ARC, como la mayoría de los desarrolladores obj-c han pasado, su segundo fragment pierde memory, puede considerar escribir así:

 NSNumber *number = [[[NSNumber alloc]initWithFloat:32.445] autorelease]; 

Con el método alloc / initWithFloat, creo que 'número' tendrá que liberarse en alguna parte.