portée autorelease

voix
6

Je me demandais comment le autorelese fonctionne sur l'iPhone. Je pensais qu'une fois que vous envoyer un autorelease à un objet , il est garanti d'être retenu dans jusqu'à la fin de la portée du bloc l' autoreleasea été envoyé. Est-ce exact?

Je suis dans la Initialisation vue d'un NIB applicationDidFinishLaunchingcomme ci - dessous:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

et la vue ne montre pas du tout, tout ce qu'il y avait sur l'écran était la UIWindow

Maintenant , une fois que j'enlevé le autoreleasede la fin de l'initialisation du contrôleur tout est bien passé à partir de là.

Ca parle de quoi?

Cheers, K.

Créé 24/02/2009 à 14:57
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
13

Lorsque vous appelez autorelease, vous donnez la propriété de l'objet à la piscine actuelle autorelease. La boucle d'exécution crée un pool autorelease avant qu'il distribue un événement ( par exemple applicationDidFinishLaunching:) et détruit ce pool lorsque l'événement se termine.

Lorsque vous donnez la propriété de votre LoginViewControllerà la piscine autorelease, il est libéré juste après les applicationDidFinishLaunching:retours. Lorsque le contrôleur de vue se désalloue, il enlève son point de vue de la superview (votre fenêtre dans ce cas).

Votre délégué application doit conserver la propriété de LoginViewControlleret releasedans l'application du délégué de deallocla méthode (ou lorsque vous avez terminé votre login et sont passés à une autre vue).

Créé 24/02/2009 à 20:50
source utilisateur

voix
4

Pour développer la réponse de Don, il peut être un peu déroutant pour dire « vous donnez la propriété de l'objet à la piscine actuelle autorelease. » Cela pourrait être mal compris pour signifier l'objet est garanti d'être détruit lorsque la piscine autorelease est drainée. Ce n'est pas correct (bien que cela se produira dans ce cas). L' envoi des -autoreleasedemandes que le pool autorelease envoyer un -releasemessage lorsqu'il est vidé. Si ce -releasemessage de fait retainCount = 0, l'objet sera détruit.

Ainsi, afin de faire ce que Don recommande, vous devez créer un Ivar de garder une trace de ce contrôleur de vue. Son explication de la raison pour laquelle la vue disparaît est tout à fait exact; mais vous ne voulez pas fuir juste le contrôleur de vue. Vous voulez conserver, et relâchez-le lorsque vous avez terminé avec elle.

@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];
}
Créé 28/04/2009 à 23:13
source utilisateur

voix
0

Puisque vous ajoutez votre LoginViewControllerà la piscine autorelease il est libérée à la fin de la boucle d'exécution. Lorsque cela arrive , il libère également sa vue et enlève d'être affiché.

Créé 24/02/2009 à 18:50
source utilisateur

voix
0

Le autoreleasepool est nettoyé à la fin de la runloop. Cela signifie aussi longtemps que vous invoquez les méthodes et faire des choses, il est toujours là.

Je ne vois pas l'erreur dans votre code, mais la fenêtre est correctement conservés dans votre exemple.

Créé 24/02/2009 à 15:09
source utilisateur

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