2012-04-13 13 views
0

私たちは写真をアップロードするアプリケーションにFacebookを統合しました。これは素晴らしい動作をしていますが、最近XCode Allocツールを使用してメモリリークを追跡し、ひどいと思われるものを発見しました。アップロード処理は別のディスパッチスレッドで実行しています。それから、Facebookのアップロードメソッドを自動リリースプールに読み込んでいます。アップロードが呼び出されると、イメージは適切なFBプロファイルに移動します。しかし、NSKeyValueMethodForPatternのアップロードは作成され、約500KBを保持します。次に、大きいもの、 - [NSConcreteMutableData appendBytes:length] getが作成され、イメージサイズに応じて約4.5MBを消費します。これらの2つはアップロードされた画像ごとに作成され、決して解放されません!私はこれで迷っている。犯人ここ恐ろしいFacebook 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; 
} 

以下のようにアロケーションツールポイントは、我々が処理した画像をアップロードするスレッドと「解放」のプールを作成するために使用しているコードです。

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

私はこれらのmem hogsを解放するために他に何かできますか?私はこのものの初心者ではありませんが、私はこれで迷っています。ここのどんな助けも素晴らしいだろう!

ありがとうございました! - Jim

+0

いつFBConnectコードを最後に更新しましたか?その方法をgithubの167行目で見てください:https://github.com/facebook/facebook-ios-sdk/blob/master/src/Facebook.m – danh

+0

私は昨晩コードを更新し、すべての並べ替えをしました問題は、私が再帰のバグに更新されたことを知るために来てください。私はそれ以来、私の人生の5時間を失った後に更新しました。それでも同じ問題があります。 – mejim707

答えて

0

FBConnectコードが古くなっているとの私のコメントを参照してください。しかし、古いバージョンには(すべての接続で)このような重大なリークがあったのかどうかは疑問です。

疑問を引くものは、非同期呼び出しです。 FBの接続はすでに非同期で動作しているので、メインにそのリクエストを残すべきだと思います。 requestWithMethodがすぐに戻るので、あなたのブロックはすぐに終了しています。

+0

あなたはここで非常に良い点を作っています。私はメインにこれ​​を送り返そうとしますが、続行する前にFacebookからの応答を待つために待機タイマーを使用するので、私はセカンダリスレッドに入れます。アップロードされた写真をマークしたい。アップロードされていない場合は、ユーザーに警告する必要があります。おそらくもっと適切な方法はありますか?メインスレッドでタイマーを使用すると、待機中にアプリが一時停止します。しかし、セカンダリスレッドでは、待機はユーザには透過的で、アプリケーションはすばやくシームレスに動作します。ありがとうございました! – mejim707

+0

私はこれを試してみましたが、アップロードをスレッドしていないにもかかわらず、男性の割り当てはまったく同じです。 8つのイメージ=約80MBが割り当てられました。この時点で私は何をすべきか分かりません。 – mejim707

+0

スタティックアナライザーを実行しましたか?製品 - >分析。これはいくつかのより良い手がかりを提供するかもしれません。 – danh

関連する問題