Pregunta

Estoy definiendo un número, como sigue:

NSNumber *nn0 = [NSNumber numberWithInt:0];

Funciona bien sin ningún tipo de asignación. Mi entendimiento es que si uso numberWithInt, alloc y init se llaman automáticamente.

Si intento liberarlo al final de mi función, tengo problemas:

[nn0 release];

Recibo un error de tiempo de ejecución.

Mi pregunta es: si uso numberWithInt para inicializar el NSNumber, ¿tengo que hacer algo de administración de memoria en él?

¿Fue útil?

Solución

Los " constructores de conveniencia " para muchos tipos, se produce un objeto que es automáticamente " autoreleased " - es decir, el nuevo objeto será retenido por el actual NSAutoreleasePool. No es necesario que libere estos objetos manualmente, ya que se liberarán cuando se libere / drene el actual NSAutoreleasePool.

Consulte esta página para obtener una descripción de los constructores de conveniencia y cómo administrar la memoria para estos.

http: // www. macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

Otros consejos

Simplemente siga la regla de administración de memoria principal: si " posee " La variable, hay que ceder finalmente la propiedad. Usted asume la propiedad al: crear el objeto (asignar / nuevo / copiar) o específicamente tomar posesión (retener). En todos estos casos, debes liberarlo.

Si necesita que el objeto se quede, debe tomar posesión de él. Entonces, si sabe que solo necesita el número para este método (como pasarlo a una matriz o lo que sea), use el método de conveniencia y simplemente déjelo ahí. Si desea mantener el número por algún motivo (y una variable de instancia, por ejemplo), puede asignarlo / iniciarlo de manera segura.

Si liberas algo que no tienes, obtendrás un error de tiempo de ejecución.

La regla es simple, con muy pocas excepciones:

  

Si el selector que devuelve un objeto tiene la palabra " nuevo " ;, " alloc " ;, " retiene " o " copiar " en él, entonces usted es dueño del objeto devuelto y es responsable de liberarlo cuando haya terminado.

De lo contrario, no eres el propietario y no debes liberarlo. Si desea mantener una referencia a un objeto no propio, debe llamar a - [NSObject retain] en esa instancia. Ahora " posee " esa instancia debe, por lo tanto, llamar a - [NSObject release] en la instancia cuando haya terminado con ella. Por lo tanto, no posee la instancia devuelta por - [NSNumber numberWithInt:] y no debe llamar a -release cuando haya terminado. Si desea mantener la instancia devuelta más allá del alcance actual (realmente más allá de la vida útil de la instancia actual NSAutoreleasePool ), debe -retain .

En términos RegEx, Peter Hosey lo explica muy bien en su blog . Eres propietario de la instancia de objeto devuelto si el selector de método coincide con esta expresión regular:

/^retain$|^(alloc|new)|[cC]opy/

Por supuesto, la referencia definitiva es la Guía de programación de administración de memoria para Cacao .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top