2009-05-21 16 views
5

Soy bastante nuevo en la programación de object-c y la liberación de objetos es mi mayor dolor de cabeza. Siempre estoy dudando de lo que necesita ser lanzado, y mis tiempos he terminado lanzando la variable incorrecta y obteniendo un BAD EXEC crash. He leído la guía de Apple sobre administración de memoria, pero no puedo ir siempre de sus ejemplos a mi código.Lanzamiento de Objective-C de singletons

Una de estas situaciones son mis singletons (soy un chico Singleton grande).

tengo una definen como esto:

static Configuration* _instance; 

+(Configuration*)getInstance{ 
    if (_instance == NULL){ 
     _instance = [Configuration alloc]; 
     [_instance initConfig]; 
    } 
    return _instance; 
} 

En mi código lo uso como esto:

//Store configuration  
Configuration* conf = [Configuration getInstance]; 
conf.userName = self.userName.text; 
conf.cellPhone = self.phoneNumber.text; 

¿Es necesario para liberar el "conf" variable?

¿Cuándo debería liberar la _instancia?

Dado que estoy ejecutando este código en iPhone, ¿qué ocurre con los vars que no publico? ¿afectarán el rendimiento del iPhone?

Respuesta

8

Cuando creó la instancia de configuración con "_instance = [Configuration alloc]; [_instance initConfig];" tenía un conteo retenido de uno de la llamada alloc. Si liberara conf después de "conf.cellPhone = self.phoneNumber.text;" entonces sería desasignado en ese punto.

Cuando crea por primera vez un objeto con alloc, o copy, o mutableCopy tendrá un conteo de retención de 1. Cada llamada para retener aumenta que retenga la cuenta en uno. Cada llamada al lanzamiento disminuye lo que retiene el recuento en 1. Llamar a la liberación automática solo significa "Liberación de llamada para mí más tarde", por lo que si se retiene y las liberaciones son como cheques, la liberación automática es como un cheque con fecha futura.

El código que accede al Singleton de configuración no lo retiene, no lo copia, ni lo copia mutable, por lo que no debería liberarlo.

Como su código está escrito ahora, el objeto de Configuración nunca se lanzará, y vivirá para la totalidad de la vida útil de las aplicaciones, que es típicamente lo que quiere con un singleton.

+0

podría echar un vistazo a esto, supongo que me puede ayudar http://stackoverflow.com/questions/6928028/objective-c-allo-release-error-in-singleton-class – Spring

2

No necesita liberar su variable conf ya que no la ha conservado.

Como regla general, debe equilibrar las llamadas a métodos que incrementan un recuento retenido con métodos que lo disminuyen.

init, retain, increméntelo, mientras release lo disminuye.

La instancia principal se libera cuando la clase está descargada, por lo que creo que no tiene por qué preocuparse.

Cuestiones relacionadas