【问题标题】:Horrible Facebook IOS integration memory leak可怕的 Facebook IOS 集成内存泄漏
【发布时间】:2012-04-13 18:55:33
【问题描述】:

我们已将 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];
}); 

我还能做些什么来释放这些内存猪吗?我不是这个东西的新手,但我对此感到茫然。这里的任何帮助都会很棒!

谢谢! - 吉姆

【问题讨论】:

  • 您上次更新 FBConnect 代码是什么时候?看看github上那个方法,第167行:github.com/facebook/facebook-ios-sdk/blob/master/src/Facebook.m
  • 我昨晚刚更新了代码,遇到了各种递归问题,来看看我更新到了递归错误。在失去 5 个小时的生命后,我再次更新。仍然有同样的问题。

标签: iphone objective-c xcode memory-leaks dispatch


【解决方案1】:

请参阅我关于 FBConnect 代码已过时的评论,但我怀疑旧版本是否存在如此严重的泄漏(对于每个连接)。

引起怀疑的是异步调用。 FB 的连接已经在异步运行,所以我认为你应该把这个请求放在主服务器上。你的代码块马上就结束了,因为 requestWithMethod 马上就返回了。

【讨论】:

  • 你在这里提出了一个很好的观点。我将尝试将其发送回主线程,但是,我将其放在辅助线程上,因为我使用等待计时器来等待 Facebook 的响应,然后再继续。我想标记照片是否已上传。如果没有上传,我想提醒用户。有没有更合适的方法?如果在主线程上使用计时器,则会导致应用程序在等待到位时暂停。然而,在辅助线程上,等待对用户来说是透明的,并且应用程序的行为快速而无缝。谢谢!
  • 我已经尝试过了,即使我没有对上传进行线程化,但它构建的男性分配完全相同。 8 张图片 = 大约 80MB 已分配。我现在不知道该怎么做。
  • 你运行静态分析器了吗?产品->分析。这可能会提供一些更好的线索。
  • 是的,我们已经做到了,一切都很好。我不明白。难道这只是抱着僵尸的模拟器?我们禁用了僵尸
  • 我一直在为此苦苦挣扎。我刚刚确认这些人在大约 4 分钟后释放。这发生在逐步下降。因此,如果您以 30 秒的间隔上传 4 张图像,男性将在不接触应用程序的情况下间隔 30 秒发布。只是观察分配工具并注意到这种行为。这是正常的还是不应该在没有启用僵尸的情况下立即释放。
猜你喜欢
  • 2015-06-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2016-10-16
相关资源
最近更新 更多