2012-04-13 1 views
0

Nous avons intégré facebook dans une application pour télécharger des photos. Cela a fonctionné très bien mais récemment en utilisant l'outil XCode Alloc pour repérer les fuites de mémoire, nous avons découvert ce qui semble être un terrible. Nous exécutons un processus de téléchargement dans un fil d'expédition distinct. Ensuite, nous chargeons notre méthode de téléchargement facebook dans un pool de publication automatique. Lorsque le téléchargement est appelé, l'image continue jusqu'au profil FB approprié. Mais, lors du téléchargement d'un NSKeyValueMethodForPattern est créé et détient environ 500 Ko. Ensuite, le grand, - [NSConcreteMutableData appendBytes: length] est créé et consomme environ 4,5 Mo en fonction de la taille de l'image. Ces deux sont créés pour chaque image téléchargée et JAMAIS DIFFUSÉ! Je suis perdu avec ça. Les points d'outils alloc au-dessous comme le coupableHorrible Facebook fuite de mémoire d'intégration IOS

- (FBRequest*)openUrl:(NSString *)url params:(NSMutableDictionary *)params 
      httpMethod:(NSString *)httpMethod delegate:(id<FBRequestDelegate>)delegate 
{ 
    [params setValue:@"json" forKey:@"format"]; 
    [params setValue:kSDK forKey:@"sdk"]; 
    [params setValue:kSDKVersion forKey:@"sdk_version"]; 
    if ([self isSessionValid]) { 
     [params setValue:self.accessToken forKey:@"access_token"]; 
    } 

    [_request release]; 
    _request = [[FBRequest getRequestWithParams:params 
            httpMethod:httpMethod 
             delegate:delegate 
            requestURL:url] retain]; 
    [_request connect]; // <<<< SAYING THIS IS 100% cause 
    return _request; 
} 

Voici le code que nous utilisons pour créer le fil et la piscine « release » pour traiter et télécharger l'image.

backgroundQueue = dispatch_queue_create("com.somecomp.appnameo.bgqueue", NULL); 

dispatch_async(backgroundQueue, ^(void) { 
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init]; 
    NSData *imageNSData = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", docDir, self.fileName]]; 
    UIImage *img = [[UIImage alloc] initWithData:imageNSData]; 

    fbResponse = 0; 
    //[facebook requestWithGraphPath:@"me" andDelegate:self]; 
    [[delegate facebook] requestWithGraphPath:@"me/permissions" andDelegate:self]; 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            //@"Sent From Some APP!", @"name", 
            self.postTitle, @"caption", 
            // string, @"description", 
            img, @"picture", 
            //@"my photo's caption text here.", @"message", 
            nil]; 

    [img release]; 

    [[delegate facebook] requestWithMethodName:@"photos.upload" 
            andParams:params 
           andHttpMethod:@"POST" 
            andDelegate:self]; 
    [loopPool drain]; 
}); 

Y at-il autre chose que je peux faire pour libérer ces porcs? Je ne suis pas un novice dans ce domaine, mais je ne sais pas ce que c'est. Toute aide ici serait fantastique!

Merci! - Jim

+0

Quand avez-vous effectué la dernière mise à jour de votre code FBConnect? Regardez cette méthode sur github, ligne 167: https://github.com/facebook/facebook-ios-sdk/blob/master/src/Facebook.m – danh

+0

Je viens de mettre à jour le code hier soir, et avait toutes sortes de récursion problèmes, venez découvrir que j'ai mis à jour directement dans un bug de récursivité. Je l'ai depuis mis à jour après avoir perdu 5 heures de ma vie. Toujours avoir le même problème. – mejim707

Répondre

0

Voyez mon commentaire sur le fait que le code FBConnect est obsolète, mais je doute que les anciennes versions aient eu une fuite aussi flagrante (pour chaque connexion).

La chose qui attire le doute est l'invocation asynchrone. La connexion de FB fonctionne déjà asynch, donc je pense que vous devriez laisser cette demande sur le principal. Votre bloc se termine tout de suite, car le requestWithMethod retourne tout de suite.

+0

Vous faites un très bon point ici. Je vais essayer de renvoyer ceci à la page principale, mais, je l'ai mis sur un fil secondaire parce que j'utilise un temporisateur d'attente pour attendre une réponse de Facebook avant de continuer. Je veux marquer les photos ayant été téléchargées ou non. Si pas téléchargé, je veux alerter l'utilisateur. Y a-t-il peut-être une méthode plus appropriée? Les minuteurs, s'ils sont utilisés sur le thread principal, provoquent une pause de l'application pendant qu'une attente est en place. Sur le thread secondaire, cependant, les attentes sont transparentes pour l'utilisateur et l'application se comporte rapidement et de manière transparente. Je vous remercie! – mejim707

+0

J'ai essayé ceci et même si je ne charge pas le téléchargement, cela crée une allocation pour les hommes exactement la même chose. 8 images = environ 80 Mo alloués. Je n'ai aucune idée à ce stade quoi faire. – mejim707

+0

Avez-vous exécuté l'analyseur statique? Produit-> Analyser. Cela pourrait fournir de meilleurs indices. – danh