Autorelease scope

votos
6

Me preguntaba cómo funciona el autorelease en el iPhone. Pensé que una vez que envíe una liberación automática a un objeto , se garantiza que se conservará hasta el final del alcance del bloque que autoreleasese envió. ¿Es eso correcto?

Estaba inicializando una vista desde un NIB de la applicationDidFinishLaunchingsiguiente manera:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

    loginViewController = [[[LoginViewController alloc] initWithNibName:@LoginView bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

y la vista no se mostró en absoluto, todo lo que había en la pantalla era el UIWindow

Ahora, una vez que eliminé la autoreleaseinicialización desde el final del controlador, todo transcurrió sin problemas a partir de ese momento.

¿De qué se trata esto?

Saludos, K.

Publicado el 24/02/2009 a las 14:57
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
13

Cuando llamas autorelease, le das la propiedad del objeto al grupo de autorrelease actual. El ciclo de ejecución crea un nuevo grupo de autorrelease antes de que distribuya un evento (como applicationDidFinishLaunching:) y destruye ese grupo cuando finaliza el evento.

Cuando cede su propiedad LoginViewControlleral grupo de autorrelease, se libera justo después de las applicationDidFinishLaunching:devoluciones. Cuando el controlador de vista se desasigna, elimina su vista de la supervista (su ventana en este caso).

El delegado de su aplicación debe conservar la propiedad del LoginViewControllery releaseen el deallocmétodo del delegado de la aplicación (o cuando haya terminado con su inicio de sesión y haya pasado a otra vista).

Respondida el 24/02/2009 a las 20:50
fuente por usuario

votos
4

Para ampliar la respuesta de Don, puede ser algo confuso decir "usted le da la propiedad del objeto al grupo de autorrelease actual". Esto podría malinterpretarse en el sentido de que se garantiza que el objeto se destruirá cuando se vacíe el conjunto de autorrelease. Esto no es correcto (aunque sucederá en este caso). Envío de -autoreleasesolicitudes para que el grupo de autorrelease envíe un -releasemensaje cuando se agote . Si ese -releasemensaje hace retainCount = 0, entonces el objeto será destruido.

Entonces, para hacer lo que Don recomienda, necesitas crear un ivar para mantener un registro de este controlador de vista. Su explicación de por qué la vista se desvanece es exactamente correcta; pero no desea simplemente filtrar el controlador de vista. Desea retenerlo y liberarlo cuando haya terminado con él.

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
Respondida el 28/04/2009 a las 23:13
fuente por usuario

votos
0

Dado que está agregando su LoginViewControlleral grupo de autorrelease, se lanzará al final del ciclo de ejecución. Cuando eso sucede, también libera su 'vista y elimina su visualización.

Respondida el 24/02/2009 a las 18:50
fuente por usuario

votos
0

El pool de liberación automática se limpia al final del runloop. Esto significa que siempre que invoque métodos y haga cosas, aún estará allí.

No veo el error en su código, pero la Ventana se conserva correctamente en su ejemplo.

Respondida el 24/02/2009 a las 15:09
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more