Estás en: Duda con release - codigo muestra
Para dar las gracias debes entrar o registrarte en el foro
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 :
//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 ]
UINavigation *leftNC =[[UINavigation alloc] initWithNibName:@"initWithRootViewController:leftVC]
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.
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.
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.