0

我们已将 facebook 集成到应用程序中以上传照片。这一直很好,但最近使用 XCode Alloc 工具来追踪我们发现的任何内存泄漏似乎很糟糕。我们正在一个单独的调度线程中运行一个上传过程。然后我们在自动发布池中加载我们的 facebook 上传方法。当上传被调用时,图像会继续发送到相应的 FB 配置文件。但是,在上传 NSKeyValueMethodForPattern 时,会创建并保存大约 500KB。然后,创建大的 -[NSConcreteMutableData appendBytes:length] 并根据图像大小消耗大约 4.5MB。这两个是为每个上传的图像创建的,永远不会发布!我对此感到茫然。alloc 工具指向下面是罪魁祸首

- (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 回答