J'utilise le code suivant plusieurs fois dans mon application (en particulier pour gérer un NavigationController):
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
Quand devrais-je le libérer?
Merci d'aider,
Stéphane
Ne pas. Ne libérez jamais votre délégué d'application – il est géré automatiquement par le operating system.
Si vous regardez dans le file main.m de votre application, vous verrez du code qui initialise une instance de UIApplication
qui représente votre application. Il est de sa responsabilité de gérer le cycle de vie du délégué de l'application, pas votre responsabilité.
EDIT comme le souligne @Goz, vous devriez le release
si vous le retain
à un moment donné. Cependant, étant donné que l'object application (et donc, par extension, son délégué) est garanti pour restr dans la scope de l'application ( sauf si vous y allez), il vaut mieux ne pas faire de memory management sur le délégué, car cela évite la possibilité d'une sur-libération accidentelle ou d'autres problèmes connexes.
Réponse courte: ne libérez jamais votre délégué d'application.
Explication:
Cela m'aide souvent à résoudre les problèmes de memory lorsque je vérifie comment les choses sont déclarées. Jetez un oeil comment la propriété de delegate
est déclarée pour UIApplication
:
@property(nonatomic,assign) id<UIApplicationDelegate> delegate;
Comme vous pouvez le voir, il est assigné à une propriété, ce qui signifie que tout ce que mem-mgmt fait ici est juste d'assigner des pointeurs pour une variable d'instance. Cela signifie que l'appel de la release
sur votre délégué d'application entraînera l' -dealloc
méthode -dealloc
pour votre MyAppDelegate
. Allez-y et essayez ceci dans le débogueur et vous verrez que votre application recevra EXC_BAD_ACCESS – c'est-à-dire qu'elle va planter.
EDIT: Cependant, comme le suggère Goz, vous pouvez appeler retain
puis release
. Mais en premier lieu, cela n'a pas de sens de faire cette chose retain/release
sur le délégué de l'application.