Duda con release - codigo muestra

Para dar las gracias debes entrar o registrarte en el foro

iMiembro
iMiembro
Mensajes: 3 Agradecido: 0
17 May 2011, 00:00# 1

Buenas noches,

Estoy empezando a programar aplicaciones con cocoa y en uno de los libros que he comprado sale una muestra del código y hay una parte que no consigo entender :

Código: Seleccionar todo

//la función empieza antes
//Es parte de un proyecto que usa el split-view controller

- (BOOL) application:(UIApplication *)application disFinishLaunchingWithOptions:( NSDictionary *) launchOptions {
........
LetfViewController *leftVC = [[LeftViewController alloc] initWithNibName:@"LeftViewController" bundle:nil ]

UINavigation *leftNC =[[UINavigation alloc] initWithNibName:@"initWithRootViewController:leftVC]

RightViewController *right = [[RightViewController alloc] initWithNibName:@"RightViewController bundle:nil]

[color=#FF0000]leftVC.delegate = rightVC
[leftVC release][/color]

UINavigation *rightNC =[[UINavigation alloc] initWithNibName:@"initWithRootViewController:rightVC]
[RightVC release ]


Como veréis, crea 2 controles y dos componentes de navegación, el segundo no lo he copiado pero es idéntico. Mi duda viene, cuando el controller izquierdo, donde está la table view va a ser el delegado del controller derecho, entonces, ( en rojo) se asigna que un controlador va a ser el delegado del otro.
La duda me viene cuando , acto seguido de asignarlo, aplica un release. Es decir, hasta donde tengo entendido, está por reference counting y al ejecutar el metodo release, se borraría.

Se ejecuta ese release porque en esta linea :
Código: Seleccionar todo
UINavigation *leftNC =[[UINavigation alloc] initWithNibName:@"initWithRootViewController:leftVC]


al iniciar con el parametro "initWithRootViewController:leftVc" está realizando un retain implicito y por eso se ejecuta el release después ??
Gracias  
Etiquetado en:
iMiembro 3G
iMiembro 3G
Mensajes: 92 Agradecido: 27
17 May 2011, 17:50# 2

Buenas villanopack. En tu codigo los alloc y releases deben quedar balanceados para no tener perdidas de memoria (leaks).

Como bien dices, en el codigo con el alloc el retainCount se incrementa con el alloc y se decrementa con el release. Cuando el retainCount llega a cero, al finalizarse un ciclo de eventos, el sistema libera el recurso (dealloc).

El manual de buenas practicas, lo que dice, es que al recoger un objeto que no es tuyo, lo que tienes que hacer es un retain para asegurarte su existencia y linerarlo cuando dejes de usarlo.

En el ejemplo que comentas, el uso es correcto, ya que creas el objeto leftVC, lo asignas al leftNC y despues lo liberas.

El objeto leftNC se encarga de incrementar el retainCount de LeftVC cuando lo asocias, ya que pasa a ser su nuevo "dueño" por eso te puedes olvidar ya en tu codigo de su gestion.

Cuando el objeto leftNC se libere, debera de liberar todo lo que tenga asociado, por lo que realizará un release de leftVC.

Espero haberme conseguido explicar.

* No respondo cuestiones técnicas por privado. Pon tus preguntas en el foro y así aprendemos todos.
Gracias  
iMiembro
iMiembro
Mensajes: 3 Agradecido: 0
19 May 2011, 12:39# 3
Sunner escribió:Buenas villanopack. En tu codigo los alloc y releases deben quedar balanceados para no tener perdidas de memoria (leaks).

Como bien dices, en el codigo con el alloc el retainCount se incrementa con el alloc y se decrementa con el release. Cuando el retainCount llega a cero, al finalizarse un ciclo de eventos, el sistema libera el recurso (dealloc).

El manual de buenas practicas, lo que dice, es que al recoger un objeto que no es tuyo, lo que tienes que hacer es un retain para asegurarte su existencia y linerarlo cuando dejes de usarlo.

En el ejemplo que comentas, el uso es correcto, ya que creas el objeto leftVC, lo asignas al leftNC y despues lo liberas.

El objeto leftNC se encarga de incrementar el retainCount de LeftVC cuando lo asocias, ya que pasa a ser su nuevo "dueño" por eso te puedes olvidar ya en tu codigo de su gestion.

Cuando el objeto leftNC se libere, debera de liberar todo lo que tenga asociado, por lo que realizará un release de leftVC.

Espero haberme conseguido explicar.



Gracias, era lo que me imaginaba. Tanta información de golpe al final es un poco difícil de asimilar y trabajar a diario con lenguajes sin gestión de memoria y el recolector de basura, se cogen hábitos y cuesta volver a cogerlos.
Gracias  
iMiembro 3G
iMiembro 3G
Mensajes: 92 Agradecido: 27
19 May 2011, 16:47# 4
villanopack escribió:Gracias, era lo que me imaginaba. Tanta información de golpe al final es un poco difícil de asimilar y trabajar a diario con lenguajes sin gestión de memoria y el recolector de basura, se cogen hábitos y cuesta volver a cogerlos.


Cierto, uno se mal acostumbra al GC. Una de las bases de la programacion para iOS es que el programador se debe de encargar de gestionar al milimetro la memoria de la aplicacion, ya que junto con el procesador son los recursos mas preciados para que las aplicaciones sean fluidas y estables.

Lo bueno es que una vez que tienes el concepto y conoces como usar los recursos a tu alcance correctamente ya se hace todo automaticamente.

Aunque a mi, al usar algun metodo raro del API siempre me quedan dudas sobre quien es el dueño de los objetos :D Menos mal que la herramienta de control de Leaks de memoria funciona de maravilla.
* No respondo cuestiones técnicas por privado. Pon tus preguntas en el foro y así aprendemos todos.
Gracias  

Publicidad
Publicidad