J'ai une application qui s'exécute en arrière-plan uniquement (en spécifiant LSBackgroundOnly
dans le fichier info.plist). Le problème est que tous les blocs que je cours sur des files d'attente parallèles ne sont pas libérés. Le code est exécuté dans un environnement géré en mémoire - aucun GC n'est impliqué.Le bloc Objective-C n'est pas libéré pour les applications en arrière-plan
Le code (simplifié) ressemble à ci-dessous. Blubber est juste une classe factice qui contient un NSDate à tester. En outre, elle écrasera retain
, release
et dealloc
faire une exploitation forestière:
NSOperationQueue *concurrentQueue = [[NSOperationQueue alloc] init];
[concurrentQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
Blubber *aBlubber = [[Blubber alloc] init];
aBlubber.aDate = [NSDate date];
[concurrentQueue addOperationWithBlock:^{
NSAutoreleasePool *blockPool = [[NSAutoreleasePool alloc] init];
NSDate *test = [aBlubber aDate];
NSLog(@"Block DONE");
[blockPool release];
}];
[aBlubber release];
[concurrentQueue release];
Si je change l'application d'une application normale (non-backgound), je peux observer les blocs étant libérés chaque fois que l'entrée est faite via l'interface utilisateur (même en changeant la mise au point à une autre fenêtre est suffisante). Depuis mon application backgorund reçoit une entrée directement sur le pilote USB HID et il n'a pas une fenêtre ou une barre de menu cela ne se produit pas.
Existe-t-il un moyen de forcer manuellement le runloop ou tout ce qui est responsable de dire aux files d'attente de libérer les blocs finis?
(Tous les autres objets qui avaient été retenus par les blocs sont pas libérés, ce qui crée d'énormes fuites de mémoire. Ces fuites ne peuvent pas être spottet par les outils Fuites ou ObjectAllocations, mais la consommation de mémoire peut observer la montée en flèche en utilisant le dessus.)
Avez-vous essayé d'utiliser les fonctions C (libDispatch) au lieu de NSOperations? – NSSplendid
Je pense qu'il donne le même résultat, car NSBlockOperation est documenté comme utilisant libDispatch en interne. Merci pour la suggestion, de toute façon, je vais donner un tourbillon dès que possible. –