El propietario del file de retención creado por Nib evita la desasignación de UIViewController

Tengo un controller de vista que quiero que se publique (y luego, posiblemente, se reasigne más tarde en la aplicación). El problema es que su vista parece tener una fuerte reference a ella como se muestra en la traza de la stack a continuación. ¿Es necesario desasignar la vista antes del controller de vista? Si es así, ¿cómo puedo hacer esto? Gracias por la ayuda 🙂

Código:

- (void)setCurrentCourse:(Course *)newCourse { ... Reference count management ... // area of concern if (currentCourse == nil) { [self.rvc.view removeFromSuperview]; [self.rvc release]; // HERE I want rvc to be deallocated, but the retainCount is one. } else { // This is where I allocate the rvc instance self.rvc = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle] courseSelectionController:self]; [self.view addSubview:self.rvc.view]; } } 

Backtrace de overriden – (id) retener;

 #0 -[RootViewController retain] (self=0x1bb610, _cmd=0x349b6814) at RootViewController.m:609 #1 0x340b1cdc in CFRetain () #2 0x341620c0 in __CFBasicHashStandardRetainValue () #3 0x34163440 in __CFBasicHashAddValue () #4 0x340b1ff8 in CFBasicHashAddValue () #5 0x340b6162 in CFSetAddValue () #6 0x340c3012 in -[__NSCFSet addObject:] () #7 0x348cb70c in -[UINib instantiateWithOwner:options:] () #8 0x348cce08 in -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] () #9 0x348465e8 in -[UIViewController _loadViewFromNibNamed:bundle:] () #10 0x34813fa4 in -[UIViewController loadView] () #11 0x346f8ebe in -[UIViewController view] () 

Solutions Collecting From Web of "El propietario del file de retención creado por Nib evita la desasignación de UIViewController"

Suponiendo que rvc es una propiedad rvc , tiene una fuga . Es por eso que el controller no está siendo dealloc . Cuando crea el controller de vista, lo está reteniendo :

 self.rvc = [[RootViewController alloc] initWithNibName:...]; 

alloc devuelve un object retenido (+1). Entonces, el establecedor de properties también conserva el object (+2). Más tarde, cuando lanzas (-1) el object, terminas con un +1.

Para resolver esto, use una variable temporal o autorelease :

 self.rvc = [[[RootViewController alloc] initWithNibName:...] autorelease]; 

Otra preocupación es la forma en que libera el object que su propiedad tiene:

 [self.rvc release]; 

Después de esta statement, ha renunciado a la propiedad del object y nada le garantiza que el object será válido en el futuro, pero su propiedad aún tiene un puntero. En otras palabras, tiene una posible reference colgante. Por lo tanto, sin la propiedad mientras la sueltas con esta statement única (esto liberará el object anterior):

 self.rvc = nil; 

Cambie [self.rvc release]; a [rvc release]; :

 - (void)setCurrentCourse:(Course *)newCourse {  // area of concern  if (currentCourse == nil) {    [self.rvc.view removeFromSuperview];    [rvc release];    // HERE I want rvc to be deallocated, but the retainCount is one.  } else {    // This is where I allocate the rvc instance    rvc = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle] courseSelectionController:self];    [self.view addSubview:self.rvc.view];  } } 

o use self.rvc = nil; porque cuando establece nil como una variable de instancia, el configurador simplemente conserva nil (que no hace nada) y libera el valor anterior.

Y use

rvc = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle] courseSelectionController:self];

en lugar de

self.rvc = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle] courseSelectionController:self];