Comme vous pouvez le voir, le code ci-dessous ne fait pas beaucoup (tous les commentaires) plus qu'énumérant sur un ensemble de fichiers, cependant, mon utilisation de la mémoire passe à plus de 2 Go après 40 secondes d'exécution de la fonction ci-dessous qui est lancée en appuyant sur un bouton sur l'interface utilisateur.Fuite de mémoire - Objectif C avec ARC activé
Je peux exécuter l'interface utilisateur pendant des heures, et avant d'appuyer sur le bouton, l'utilisation de la mémoire ne dépasse pas 8 Mo.
Étant donné que l'ARC est activé, que contient la mémoire?
removed original code as the edit below made no differance.
EDIT:
Tentative @autoreleasepool{ dispatch_asyny ... }
et permutations de qu'autour du temps et à l'intérieur de la boucle while qui n'a eu aucun effet.
Voici le code avec autorelasepool ajouté et nettoyé
-(void) search{
self.dict = [[NSMutableDictionary alloc] init];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/SeaWall.log"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *bundleRoot = @"/";
NSFileManager *manager = [NSFileManager defaultManager];
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot];
NSString *filename;
while ((filename = [NSString stringWithFormat:@"/%@", [direnum nextObject]]) && !self.exit) {
@autoreleasepool {
NSString *ext = filename.pathExtension;
if ([ext hasSuffix:@"so"] || [ext hasSuffix:@"dylib"]) {
if (filename == nil || [NSURL URLWithString:filename] == nil) {
continue;
}
NSData *nsData = [NSData dataWithContentsOfFile:filename];
if (nsData != nil){
NSString *str = [nsData MD5];
nsData = nil;
[self writeToLogFile:[NSString stringWithFormat:@"%@ - %@", [filename lastPathComponent], str]];
}
}
ext = nil;
} // end autoreleasepool
}
[fileHandle closeFile];
[self ControlButtonAction:nil];
});
}
Je ne sais pas ce que vous entendez par le corps de la boucle. Donc, je l'ai essayé avec ce qui suit: Autour de 'dispatch_async' qui n'a rien fait. à l'intérieur 'dispatch_async' et enfermant tout le reste qui n'a rien fait non plus. Autour de la boucle tout ce qui n'a rien fait non plus. – Cripto
@Cripto il doit être à l'intérieur de la boucle. Le corps de la boucle est le code entre parenthèses après la ligne 'while'. – zneak
S'il vous plaît jeter un oeil à mon édition. Cela ne semble pas fonctionner comme prévu. Merci – Cripto