【问题标题】:Memory allocation growth on a method which fetches server data获取服务器数据的方法的内存分配增长
【发布时间】:2012-07-05 19:56:41
【问题描述】:

我有一个从服务器获取数据的方法。我在循环中多次调用该方法。问题是当我使用仪器检查内存分配时,每个方法调用中的实时内存都增加了。顺便说一句,我正在使用 ARC。

-(NSArray*)callService
{
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL: serviceURL];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:requestData];
    [request setTimeoutInterval:30.0];
    NSURLResponse *response = NULL; 
    NSError *requestError = NULL;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSArray *array = [(NSArray*) [responseString JSONValue] autorelease];
    responseString=nil;
    return array;
}

【问题讨论】:

  • 您在使用 ARC 吗?如果没有,您应该在返回之前为requestCountjsonresponseString 调用release。

标签: ios memory-management memory-leaks instruments


【解决方案1】:

问题出在 SBJSON 解析器上。因为我使用的是 iOS 5,所以我使用了 NSJSONSerialization,它就像一个魅力。

NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseData options: NSJSONReadingMutableContainers error: &e];

而不是 JSONValue

【讨论】:

    【解决方案2】:

    如果您启用了僵尸程序(方案设置),请确保在 Instruments 中测试内存使用情况时将其关闭。 NSDeallocateZombies 的默认设置是 NO,所以僵尸根本不会被删除。因此,要么将 NSZombiesEnabled 设置为 NO(或等效的方案复选框),要么将 NSDeallocateZombies 设置为 YES。

    【讨论】:

    • 我尝试了 NSZombiesEnabled 和 NSDeallocateZombies。两者都没有工作。它显示了相同的内存量
    【解决方案3】:

    我有一个从服务器获取数据的方法。我正在调用方法 在一个循环中多次。

    不要。调用一个,等待响应,然后调用下一个。

    编辑 1:

    同步加载建立在异步加载之上 加载类提供的代码。调用线程是 在异步加载系统执行 URL 加载时被阻塞 专门为此加载请求生成的线程。没有特别的 调用线程中需要线程或运行循环配置 为了执行同步加载。

    因为这个电话可能需要几分钟才能 失败(尤其是在 iOS 中使用蜂窝网络时),您应该 永远不要从 GUI 应用程序的主线程调用此函数。

    【讨论】:

    • 这是一个同步请求。所以它会自动等待响应。
    • 是的。但我的记忆力有问题。
    • 你能试试我的建议吗?前一个已发送。
    • 我不明白你的意思。你能不能更精确一点。
    • 你的意思是在单独的线程中调用方法会解决内存问题吗?
    猜你喜欢
    • 2014-12-11
    • 2014-11-23
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多