从 iPhone 上传文件时出现 POSIX 错误 12(“无法分配内存”)

2024-01-04

我正在开发一个 iPhone 应用程序,该应用程序涉及将相机中的完整照片(通常每张照片在 1.5 到 2.0 MB 之间)及其缩略图(小得多)上传到 Amazon S3。

缩略图总是成功上传,但是有时完整图像则不然,当它们失败时,它们会失败并显示 POSIX 错误代码 12(又名 ENOMEM)。不过,我添加了调试代码来在错误发生时打印可用内存量,并且总是有相当多的可用内存,通常超过 100 MB。

此外,当通过 3G 上传时,错误会更频繁地出现,而通过 wifi 上传时,错误会更少出现——这看起来很奇怪,因为请求没有下载太多,并且上传的文件已经在内存中(我也尝试过)从磁盘流式传输,没有任何改进)。

我尝试使用 NSURLConnection、Foundation CFHTTP* 函数和 ASIHTTPRequest 库上传文件,但无论如何,错误发生的频率相同。更奇怪的是,我的谷歌搜索显示,最终用户有时会从 Safari 收到错误代码 12——我还没有看到任何 iOS 开发人员提到过这一点。我正在使用继承的代码库,因此它可能有问题,但我什至不确定要寻找什么。任何见解将不胜感激!


我能够解决这个问题的唯一方法是直接使用套接字并手动形成 HTTP 标头。所以我的上传代码目前如下所示:

- (void)socketClose
{
    [_inputStream setDelegate:nil];
    [_inputStream close];
    [_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    SCR_RELEASE_SAFELY(_inputStream);

    [_outputStream setDelegate:nil];
    [_outputStream close];
    [_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    SCR_RELEASE_SAFELY(_outputStream);

    SCR_RELEASE_SAFELY(_headerBuffer);
}

- (void)sendRequest
{
    [self socketClose];
    SCR_RELEASE_SAFELY(_headerBuffer);

    if (!_shouldCancel)
    {
        NSString *httpMessage = [NSString stringWithFormat:@"POST upload.php HTTP/1.1\r\n"
                                 "Host:"
#ifndef TESTBED
                                 " %@"
#endif
                                 "\r\n"
                                 "User-Agent: MyApp/3.0.0 CFNetwork/534 Darwin/10.7.0\r\n"
                                 "Content-Length: %d\r\n"
                                 "Accept: */*\r\n"
                                 "Accept-Language: en-us\r\n"
                                 "Accept-Encoding: gzip, deflate\r\n"
                                 "Content-Type: application/x-www-form-urlencoded\r\n"
                                 "Connection: keep-alive\r\n\r\n"
                                 "data="
#ifndef TESTBED
                                 , [self.serverUrl host]
#endif
                                 , _bytesToUpload];

        NSString *key = @"data=";
        NSData *keyData = [key dataUsingEncoding:NSASCIIStringEncoding];
        _bytesToUpload -= [keyData length];
        _bytesToUpload = MAX(0, _bytesToUpload);

        _headerBuffer = [[NSMutableData alloc] initWithData:[httpMessage dataUsingEncoding:NSUTF8StringEncoding]];

        _writtenDataBytes = 0;

        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault
                                           , (CFStringRef)[self.serverUrl host]
#ifdef TESTBED
                                           , 8888
#else
                                           , 80
#endif
                                           , (CFReadStreamRef *)(&_inputStream)
                                           , (CFWriteStreamRef *)(&_outputStream));

        [_inputStream setDelegate:self];
        [_outputStream setDelegate:self];

        [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

        [_inputStream open];
        [_outputStream open];
    }
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    if (_outputStream == theStream)
    {
        switch (streamEvent)
        {
            case NSStreamEventOpenCompleted:
            {
                [self regenerateTimeoutTimer];
                break;
            }
            case NSStreamEventHasSpaceAvailable:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);
                NSInteger length = _headerBuffer.length;

                if (length > 0)
                {
                    NSInteger written = [_outputStream write:(const uint8_t *)[_headerBuffer bytes] maxLength:length];
                    NSInteger rest = length - written;

                    if (rest > 0)
                    {
                        memmove([_headerBuffer mutableBytes], (const uint8_t *)[_headerBuffer mutableBytes] + written, rest);
                    }

                    [_headerBuffer setLength:rest];
                }
                else
                {
                    const uint8_t *dataBytes = [_data bytes];

                    while ([_outputStream hasSpaceAvailable] && (_writtenDataBytes < _bytesToUpload))
                    {
                        NSInteger written = [_outputStream write:dataBytes
                                                       maxLength:MIN(_dataLength, _bytesToUpload - _writtenDataBytes)];

                        if (written > 0)
                        {
                            _writtenDataBytes += written;
                        }
                    }
                }

                [self regenerateTimeoutTimer];

                break;
            }
            case NSStreamEventErrorOccurred:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);
                [self reportError:[theStream streamError]];                
                break;
            }
            case NSStreamEventEndEncountered:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);
                [self socketClose];
                break;
            }
        }
    }
    else if (_inputStream == theStream)
    {
        switch (streamEvent)
        {
            case NSStreamEventHasBytesAvailable:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);

                /* Read server response here if you wish */

                [self socketClose];

                break;
            }
            case NSStreamEventErrorOccurred:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);
                [self reportError:[theStream streamError]];
                break;
            }
            case NSStreamEventEndEncountered:
            {
                SCR_RELEASE_TIMER(_timeoutTimer);
                [self socketClose];
                break;
            }
        }
    }
}

尽管 ASIHTTPRequest 可以在这里工作,但我们决定放弃这种依赖关系,以便获得性能并让一切都在我们自己的准确控制之下。您可以使用 Wireshark 工具来调试此类事情。

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

从 iPhone 上传文件时出现 POSIX 错误 12(“无法分配内存”) 的相关文章

  • 是否可以修改 $_SESSION 变量?

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • iPhone——是否可以在 Xcode 调试器中检查 UIView 的框架?

    当调试器在断点处停止时 我在那里找不到任何 UIView 的框架 是否有可能做到这一点 编辑 由于缺乏回应而开始赏金 需要明确的是 我正在寻找一种在不添加额外调试代码的情况下查看框架的方法 另外 如果答案是 不 你不能这样做 赏金将用于解释
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • 进入/退出编辑模式时重绘 UITableViewCell

    我有一个表格视图 其中根据表格是否正在编辑 单元格的构建方式有所不同 具体来说 处于编辑模式时选择样式为无 非编辑模式时选择样式为蓝色 当我从一个单元转换到另一个单元时 我注意到某些单元格没有更新 快速的日志记录告诉我 即使单元格的外观发生
  • iPhone UITableView 分页结果

    对从服务器拉取的大量结果进行分页的最佳方法是什么 就服务器而言 我可以抵消和限制结果 因此我一次只能提取 25 个结果 但是允许用户查看更多结果而不需要像应用商店一样不断向下滚动不断增长的列表的最佳方式是什么应用程序 谢谢 豪伊 要在列表底
  • 如何在 iBooks 上搜索桌面 UI

    我想像 iBooks 中那样显示 tableview 的搜索栏 我如何减少搜索栏的宽度以及如何在没有任何背景颜色的情况下显示它 另外 当页面显示时 如何最初隐藏搜索框 我可以想到两个选择 通过子类化 UITextfield 创建您自己的 U
  • 在 iOS 模拟器主屏幕或锁屏中设置壁纸(背景图像)

    当我正在绞尽脑汁思考某件事时 我的脑海中突然出现了这个想法 我们可以将模拟器的主屏幕背景图像设置为我们选择的图像吗 Xcode 3 2 2 模拟器 3 1 3 就是一个很好的例子 Certain versions of the simula
  • 调整 SKShapeNode 的大小

    如何调整 SKShapeNode 的大小 到目前为止我尝试过的 调整框架大小 box frame width 10 给出错误Cannot assign to the result of this expression SKAction le
  • 显示不带字母的数字键盘

    iOS 默认数字键盘中是否有隐藏数字下方字母的选项 对于某些电话语言 键盘显示时不带字母 抱歉 你所要求的是不可能的 这取决于键盘语言 只有用户可以更改键盘语言 我希望这能帮到您
  • :hover 状态在 iOS 上不会结束

    我有一个带有悬停状态的简单菜单
  • AVAudioPlayer只能在模拟器中播放,但不能在设备中播放,为什么?! (iPhone-SDK)

    我有以下播放声音的简单代码 NSString soundPath NSBundle mainBundle pathForResource sound ofType wav player AVAudioPlayer alloc initWit
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • 将 UITableViewDataSource 与具有子视图的自定义单元格结合使用

    在 UITableView 中使用自定义单元格时 我遇到了奇怪的表格重叠 Problem 向下滚动 最后两行上面画有顶部两行 向上滚动 前两行上面画有下面两行 这是 UITableViewDataSource 的代码 func tableV
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • iOS 中如何清除特定域的 cookie?

    我已经搜索了 StackOverflow 上的几乎所有问题来寻找我的问题的答案 我还没有找到任何有用的链接或教程来说明哪种方式最好清除特定域的 cookie 如果有人可以帮助我 请 我自己找到了解决方案 如果您想删除 UIWebView 中
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • 当我从我转向的视图控制器返回时,为什么我的 UITableView 的格式完全出错了?

    我有一个UITableView使用自定义单元格 其中有一些标签可以动态决定单元格的高度 当我点击一个单元格并转到一个新的视图控制器时 返回后所有单元格的格式完全混乱 我无法弄清楚是什么导致了它 这是细胞通常的样子 我对它们设置了一些非常基本
  • UITextView 动画更改框架不会动画文本重新分配

    我有一个 UITextView 我试图在用户点击按钮时为框架的变化设置动画 基本上 文本视图会变大以适应屏幕 以便可以显示更多文本 然后当用户再次点击按钮时 它会缩小到原始框架 我使用块执行动画 如下所示 if isDisplayingDe
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My

随机推荐

  • iOS:动态标记信息窗口

    我正在尝试将图像动态加载到信息窗口中 问题是 SDWebImage 永远不会完成 但是 一旦我再次单击标记 图像就会显示并被调用 但从未在第一次调用 我的 运行 日志第一次显示 所以我知道代码正在被调用 但第一次运行时永远不会显示完整 除非
  • 无限强度 Jce 和 Android

    我正在使用 SpongyCastle BouncyCastle 的 Android 加密功能的完整实现 并且我有一个包含大小为 384 的密钥的 bks 我正在尝试使用 KeyStore getKey alias password 方法提取
  • 当仅需要保存日期时,将其转换为 UTC 然后再转换为本地可能在不同时区表现不同

    我在前端有一个日期字段 我从一个时区保存它 比如 2018 年 4 月 19 日 我的时间是 8 当我在本地 datetime ToLocalTime 上加载它时 它在 8 偏移量中完美工作 它将显示 19 04 2018 但坐在 7 的人
  • Android StringBuilder 与字符串连接

    我正在阅读此文档页面 http developer android com reference android util Log html http developer android com reference android util
  • Ember路由:在多个父路由下重用资源

    我有以下路由设置 this resource blog function this resource selectimage path selectimage returncontext function this resource pos
  • 企业架构师:状态中进入/退出功能的顺序

    在我的状态机中 我有一个具有多个进入和退出函数的状态 Enterprise Architect 按字母顺序对它们进行排序 这可能会导致如下结果 entry a exit b entry c 进入和退出函数就是 EA 所说的 元素操作 问题
  • 用于 BERT 微调的优化器和调度器

    我正在尝试使用 BERT 微调模型 使用transformers库 我对优化器和调度程序有点不确定 首先 我明白我应该使用transformers AdamW而不是 Pytorch 的版本 另外 我们应该按照论文中的建议使用预热调度程序 因
  • 包含函数指针的类可以用作非类型模板参数吗?

    考虑下面的类S包含一个函数指针和一个constexpr object s使用 lambda 初始化该类 struct S void f constexpr S s 现在如果我写一个模板X具有 type 的非类型模板参数S 并实例化它s像这样
  • 流缓冲区 - Google BigQuery

    我正在开发一个 python 程序来使用 Google Dataflow 模板 我正在做的是将数据从 PubSub 写入 BigQuery pipeline options view as StandardOptions streaming
  • C++ 代码中的 const 和weak 属性

    我无法理解下面的编译错误 第一个文件是标题 test weak h ifndef TEST WEAK H define TEST WEAK H ifndef ASSEMBLER const char const TUTU attribute
  • 如何按日期对对象数组进行排序?

    我正在尝试对对象数组进行排序 每个对象包含 var recent id 123 age 12 start 10 17 13 13 07 id 13 age 62 start 07 30 13 16 30 日期格式为 mm dd yy hh
  • 使用 JavaScript 禁用引导选择选项

    我尝试使用 javascript 禁用我的特定引导选择选项 我知道如何禁用 正常选择选项 但是当使用引导选择时它不起作用 它被禁用 变灰 但我仍然可以选择它 这里jsfidle https jsfiddle net ybf5hpam 1
  • 使用 ImpersonateLoggedOnUser 移动文件

    我正在尝试移动文件 但出现此错误 System UnauthorizedAccessException 对路径的访问被拒绝 在 System IO Error WinIOError Int32 errorCode String MaybeF
  • 如何使用spring security(spring boot)实现Ldap身份验证

    我有以下代码 我正在尝试实现 ldap 身份验证 但我认为它没有发生 我的安全配置 EnableWebSecurity Configuration Order SecurityProperties ACCESS OVERRIDE ORDER
  • 如何使用 C# 的 ANTLR 获取 Lexer 和 Parser?

    似乎 ANTLR 支持 C 语言 但我不知道如何生成相关类 我搜索并看到存在 Visual Studio 扩展 但我不支持 2015 那么如何使用 ANTLR 手动为 C 生成词法分析器和解析器 VS 扩展主要用于语法突出显示和编辑器细节
  • jQuery UI 选项卡 - IE 中的圆角选项卡角

    我正在尝试从 AjaxControlToolkit 切换到 jQuery UI 选项卡以获得相当简单的选项卡元素 我 99 都掌握了 CSS 和主题 但我在尝试在 IE 中的选项卡上实现圆角时遇到了困难 jQuery UI 提供了更好的浏览
  • reinterpret_cast 类型双关实际上是未定义的行为吗?

    这种类型的双关语似乎被广泛持有reinterpret cast以某种方式被禁止 正确地说 未定义的行为 即 本国际标准没有提出要求的行为 https timsong cpp github io cppwp n4659 defns undef
  • TFS 传输层安全 1.1/1.2

    我们目前在 Windows Server 2012 R2 上使用 TFS 2015 3 使用 NARTAC 指定使用 TLS1 1 1 2 并禁用 TLS1 0 后 我们的构建层服务器无法连接到应用层服务器 有没有人有同样的问题并解决了 谢
  • 语义相关性算法 - python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想找到两个同义词集之间的相关性 我遇到了许多算法 如 resnik lin wu palmer path 算法 leacock ch
  • 从 iPhone 上传文件时出现 POSIX 错误 12(“无法分配内存”)

    我正在开发一个 iPhone 应用程序 该应用程序涉及将相机中的完整照片 通常每张照片在 1 5 到 2 0 MB 之间 及其缩略图 小得多 上传到 Amazon S3 缩略图总是成功上传 但是有时完整图像则不然 当它们失败时 它们会失败并