0

写真をアップロードするアプリケーションに facebook を統合しました。これはうまく機能していますが、最近 XCode Alloc ツールを使用してメモリ リークを追跡し、ひどいものと思われるメモリ リークを発見しました。別のディスパッチ スレッドでアップロード プロセスを実行しています。次に、facebook のアップロード メソッドを自動リリース プールに読み込みます。アップロードが呼び出されると、画像は適切な FB プロファイルに送られます。ただし、アップロード中に NSKeyValueMethodForPattern が作成され、約 500KB を保持します。次に、大きな -[NSConcreteMutableData appendBytes:length] get が作成され、画像サイズに応じて約 4.5MB を消費します。これらの 2 つは、アップロードされた画像ごとに作成され、リリースされることはありません。私はこれで途方に暮れています。割り当てツールは、原因として以下を指しています

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

これらのメモリ豚を解放するために他にできることはありますか? 私はこのことの初心者ではありませんが、これで途方に暮れています。ここでの助けは素晴らしいでしょう!

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

4

1 に答える 1

0

FBConnect コードが古くなっているという私のコメントを参照してください。

疑わしいのは非同期呼び出しです。FBのコネクションはすでに非同期で運用されているので、そのリクエストはメインに残したほうがいいと思います。requestWithMethod がすぐに返されるため、ブロックはすぐに終了します。

于 2012-04-14T00:01:13.503 に答える