2012-04-13 16 views
0

Wir haben Facebook in eine Anwendung integriert, um Fotos hochzuladen. Das funktioniert gut, aber seit kurzem nutzen wir das XCode-Alloc-Tool, um alle Speicherlecks aufzuspüren, die wir entdeckt haben und die scheinbar schrecklich sind. Wir führen einen Upload-Prozess in einem separaten Versandthread aus. Dann laden wir unsere Facebook-Upload-Methode in einen Auto Release-Pool. Wenn der Upload aufgerufen wird, geht das Image auf das entsprechende FB-Profil über. Aber beim Hochladen wird ein NSKeyValueMethodForPattern erzeugt und hält ca. 500KB. Dann wird die große, - [NSConcreteMutableData appendBytes: length] get erstellt und verbraucht etwa 4,5MB, abhängig von der Bildgröße. Diese beiden werden für jedes hochgeladene Bild erstellt und NIEMALS VERÖFFENTLICHT! Damit bin ich ratlos. Die alloc-Tool zeigt auf die unten als der Schuldige istHorrible Facebook IOS Integration Speicherleck

- (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; 
} 

Hier ist der Code verwenden wir den Faden und „Freigabe“ Pool zu erstellen, das Bild zu verarbeiten und zu laden.

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]; 
}); 

Gibt es noch etwas, was ich tun kann, um diese Memos freizugeben? Ich bin kein Neuling in diesem Zeug, aber ich bin damit ratlos. Jede Hilfe hier wäre fantastisch!

Vielen Dank! - Jim

+0

Wann haben Sie Ihren FBConnect-Code zuletzt aktualisiert? Sehen Sie sich diese Methode auf GitHub an, Zeile 167: https://github.com/facebook/facebook-ios-sdk/blob/master/src/Facebook.m – danh

+0

Ich habe gerade den Code letzte Nacht aktualisiert und hatte alle Arten von Rekursion Probleme, kommen, um herauszufinden, dass ich direkt in einen Rekursion Bug aktualisiert. Ich habe seitdem wieder aktualisiert, nachdem ich 5 Stunden meines Lebens verloren habe. Immer noch das gleiche Problem. – mejim707

Antwort

0

Siehe meinen Kommentar über den FBConnect-Code veraltet, aber ich bezweifle, dass die älteren Versionen ein so ungeheuerliches Leck (für jede Verbindung) hatten.

Die Sache, die den Verdacht auf sich zieht, ist der Asynch-Aufruf. Die Verbindung der FB funktioniert bereits asynch, also sollten Sie diese Anfrage im Hauptfenster hinterlassen. Ihr Block ist sofort fertig, weil die requestWithMethod sofort zurückkehrt.

+0

Sie machen hier einen sehr guten Punkt. Ich werde versuchen, dies an die Hauptstelle zurückzusenden, aber ich habe es in einen sekundären Thread eingefügt, weil ich einen Wartetimer verwende, um auf eine Antwort von Facebook zu warten, bevor ich fortfahre. Ich möchte die hochgeladenen Fotos markieren oder nicht. Wenn nicht hochgeladen, möchte ich den Benutzer warnen. Gibt es vielleicht eine geeignetere Methode? Wenn die Timer im Hauptthread verwendet werden, wird die App angehalten, während eine Wartezeit besteht. Im sekundären Thread sind die Wartezeiten jedoch für den Benutzer transparent und die App verhält sich schnell und nahtlos. Vielen Dank! – mejim707

+0

Ich habe das versucht und obwohl ich den Upload nicht threaded baut Männer Zuordnung genau das gleiche. 8 Bilder = ca. 80 MB zugewiesen. Ich habe an diesem Punkt keine Ahnung, was ich tun soll. – mejim707

+0

Haben Sie den statischen Analysator ausgeführt? Produkt-> Analyse. Dies könnte einige bessere Hinweise liefern. – danh