NSURLConnection 搞乱了 iPad 内存

2024-01-24

我们构建了一个 iPad 应用程序,可以从 Web 服务下载大量数据和 PDF 文档(首先是数据,然后在后台下载文档)。为此,我们通过 HTTP(S) 请求使用 SOAP。它工作正常,总的来说,该应用程序运行良好。问题是,如果某个时候有太多文档需要下载,应用程序就会崩溃。使用 Instruments 我发现这是一个内存问题,特别是 NSRegularExpression 和 NSRunLoop。 (我用的是ARC)

我可以改进我的代码以优化 NSRegularExpression 创建。但我不知道如何改善 NSRunLoop 问题。

我尝试了异步和同步 HTTP 请求。使用异步,我必须等待下载完成,并且由于 sleep()/[NSThread sleepForTimeInterval:] 不是一个选项,所以我使用

while ( _waitToFinish ) {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

使用同步请求,Instruments 揭示了

[NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];

也在 NSRunLoop 的帮助下“等待”,并且也弄乱了内存。

这是 CoreFoundation 或 ARC 中的错误吗?

在等待请求完成时还有其他方法可以空闲吗?

提前致谢。

Edit:

对于“内存问题”,我的意思是应用程序崩溃(或被 iOS 杀死),因为它使用了太多内存。

This is what Instruments shows: Instruments screenshot The percentage get higher the longer the app is downloading.

Edit:

再往下看,发现是 NSURLConnection,它搞乱了内存。看来我错过了设置connection and receivedData to nil (see URL加载系统编程指南 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html)。这又稍微改善了我的内存使用情况。

Now, there are two more big memory allocation operations: enter image description here

这是我认为属于 Instruments 显示的代码:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_receivedData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {    
    NSString *responseText = [[NSString alloc] initWithBytes:[_receivedData mutableBytes] length:[_receivedData length] encoding:NSUTF8StringEncoding];

    self.lastResponse = responseText;

    responseText = nil;
    connection = nil;
    _receivedData = nil;

    _lastResult = TRUE;
    _waitToFinish = FALSE;
}

我可以改变什么来改进代码吗?

Edit:(更改标题“NSRunLoop 弄乱 iPad 内存”)

Edit:我创建了一个测试应用程序来证明是 NSURLConnection 搞乱了内存。然后我联系了苹果开发者支持。

由于我在使用 NSURLConnection 的迭代中下载了大量 PDF,因此解决方案是添加@autoreleasepool { .. }在迭代中和围绕NSRunLoop.

Thanks.


这不是 Core Foundation 或 ARC 中的错误。这是你的代码中的一个错误。

不要自己运行 run 循环。只需使用+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]。它会调用你的completionHandler当请求完成时阻塞。那是你处理响应的时候。同时,只需返回您的方法并让系统担心运行运行循环。

你说“这是一个内存问题”NSRegularExpression and NSRunLoop,但您没有说明问题是什么,或者 Instruments 向您展示了哪些证据。如果您更详细地描述“问题”,也许我们可以帮助您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSURLConnection 搞乱了 iPad 内存 的相关文章

  • 使用 Objective C 将 RGB 彩色图像更改为灰度图像

    我正在开发一个将彩色图像更改为灰度图像的应用程序 然而 有些图片显示出来是错误的 我不知道代码有什么问题 也许我输入的参数有误 请帮忙 UIImage c UIImage imageNamed downRed png CGImageRef
  • 如何连续关闭 2 个模态视图控制器?

    我有 2 个以模态方式呈现的视图控制器 A presents B which presents C 当我解雇C时 我也想解雇B 但我不知道该怎么做 解雇C self dismissModalViewControllerAnimated YE
  • Dropbox API - 使用 Dropbox 作为服务器

    我想使用文件共享服务器来使某些文件在多台计算机上的应用程序的多个实例中保持最新和恒定 例如 例如 编写多人游戏 它将所有玩家的位置存储在文本文件中 并使用 Dropbox 之类的工具在所有应用程序中保持文本文件不变 每个应用程序实例都可以根
  • Objective-C 原始数之间的差异

    What is the difference between objective c C primitive numbers I know what they are and how to use them somewhat but I m
  • 如何将 NSString 值 @"3.45" 转换为浮点数?

    如何将 NSString 值 3 45 转换为浮点数 3 45 float fCost NSDecimalNumber decimalNumberWithString 3 45 floatValue NSString val 3 45 fl
  • 使用 WebRTC 构建 iOS 本机应用程序

    我找了4天了 还是没找到 我构建了所有库并将其集成到我的自定义项目中 但我不知道应该采取哪些步骤才能使其正常工作 我在代码示例 解释中发现的唯一内容是 tech appear in 2015 05 25 Getting started wi
  • 管理一堆具有依赖关系的 NSOperation

    我正在开发一个创建内容并将其发送到现有后端的应用程序 内容是标题 图片和位置 没有什么花哨 后端有点复杂 所以这是我必须做的 让用户拍照 输入标题并授权地图使用其位置 为帖子生成唯一标识符 在后台创建帖子 上传图片 刷新用户界面 我使用了几
  • NSView 鼠标跟踪

    我在 Mac OS X 上遇到了 Cocoa NSView 的奇怪行为 我在 NSView 容器中有一个自定义 NSView 这个自定义 NSView 跟踪鼠标移动 点击 并有一个工具提示 当我在所描述的视图上方添加 NSView 时 即使
  • 如何为整个 iOS 应用程序设置自定义字体而不指定大小

    我正在尝试在整个我的应用程序中应用自定义字体iOS app 我发现我可以使用 UILabel appearance setFont UIFont fontWithName Proxima Nova size 17 0 设置所有的默认字体和大
  • 在 Cocoa Mac OSX 中设置 FirstResponder 时出现问题

    我正在开发一个小应用程序只是为了学习可可 并且我很难将 FirstResponder 设置为某些 NSTextFields 当视图打开时 我希望选择第一个 NSTextField clientNumber 因此我在 loadView 方法末
  • 如何在iPhone中将字节数组转换为base64字符串?

    我有一段vb代码 我需要将字节数组转换为 Base 64 字符串 下面是vb代码 如果 arrLicence Count gt 0 那么 LicenseBytes CType Array CreateInstance GetType Byt
  • HTML Mobile - 强制软键盘隐藏[重复]

    这个问题在这里已经有答案了 我正在为一家优惠券公司开发前端网站 我有一个页面 用户只需输入电话号码和花费的美元 我们想出了一个有趣的内置 Javascript 屏幕键盘 它易于使用且快速 但是 我正在寻找一种解决方案 以在用户聚焦并在这些字
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • iOS 中系统日期更改后如何更改带有日期的标签?

    我有一个简单的查询 但不知道该怎么做 这就是我想要实现的目标 1 我有一个带有今天日期的 UILabel 即 29 04 12 2 在午夜 我希望该标签自行更新为 30 04 12 而无需更改视图或按任何内容 这是第2步 我不知道该怎么做
  • UILongPressGestureRecognizer 不起作用,但将其替换为 UITapGestureRecognizer 效果很好。为什么?

    我有一个UIImageView with a UILongPressGestureRecognizer无论我如何配置手势识别器 似乎都不会检测到长按手势 但是 如果我把它换成UITapGestureRecognizer that工作得很好
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • 如何使用 MonoTouch 在 UIKeyboard 之上添加 UIToolbar?

    我按照 Obj C 中的示例进行操作定制 iPhone 键盘 https stackoverflow com questions 1610542 custom iphone keyboard 1612549 1612549但是 为了在 Wi
  • ObjectiveC 和 JavaScriptCore:使用这种调用回调的方法会导致内存问题吗?

    免责声明 这是一篇很长的文章 但对于那些努力使用新的 ObjectiveC JavascriptCore 框架并在 ObjC 和 JS 之间进行异步编码的人来说可能非常有价值 您好 我对 Objective C 非常陌生 正在将 javas
  • iOS 11 中的密码自动填充快速输入栏

    iOS 11 中引入了一项新功能 应用程序密码自动填充 此功能允许用户直接从键盘快速输入栏使用其应用程序中保存的密码 https techcrunch com 2017 06 08 ios 11s new password autofill
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐