iphone - 3G网络中NSPOSIXErrorDomain Code=12 "Cannot allocate memory"

标签 iphone objective-c memory ftp posix

我正在尝试在我的 iPhone 应用程序中发送 FTP 服务器上的文件。 在 WiFi 和 GSM:EDGE 网络中似乎一切正常,但在 3G 网络中出现错误(并非总是如此,但经常出现):

Error Domain=NSPOSIXErrorDomain Code=12 "The operation couldn’t be completed. Cannot allocate memory"

出现错误的代码下方:

- (void)stream:(NSStream*)aStream handleEvent:(NSStreamEvent)eventCode {

    switch( eventCode ) {
        case NSStreamEventHasSpaceAvailable: {
            if( _readDataOffset == _readDataLimit ) {
                NSInteger readDataLen = [_readStream read:[_readData mutableBytes] maxLength:kReadDataLength];
                NSLog(@"readDataLen is %d",readDataLen);
                if( -1 == readDataLen ) {
                    _error = [[_readStream streamError] retain];
                    _keepRunning = NO;
                } else if( 0 == readDataLen ) {
                    _keepRunning = NO;
                } else {
                    _readDataOffset = 0;
                    _readDataLimit = readDataLen;
                }
            }

            if( _readDataOffset != _readDataLimit ) {
                NSOutputStream* writeStream = (NSOutputStream*)aStream;

                uint8_t *buffer = (void *)[_readData bytes];

          // vvvv and here  the value of writtenDataLen is often -1 (but only on 3G network)
                NSInteger writtenDataLen = [writeStream write:&buffer[_readDataOffset] maxLength:_readDataLimit - _readDataOffset]; 


                if( writtenDataLen > 0 ) {
                    _readDataOffset += writtenDataLen;
                    _writtenDataLen += writtenDataLen;
                    [self ftpPutDidWriteInternal];
                } else if( -1 == writtenDataLen ) {
                    _error = [[writeStream streamError] retain];
                    _keepRunning = NO;
                }
            }

        } break;
        case NSStreamEventErrorOccurred: {
            _error = [aStream.streamError retain];
            _keepRunning = NO;
        } break;
    }    
}

重要的是,整个发送是在单独的线程中完成的,它有自己的 NSAutoreleasePool。 有没有人遇到这个问题?有什么建议吗?我将不胜感激。

更新: 我刚刚检查了流行的 iPhone 应用程序“FTP On The Go”在 3G 网络中发送文件时遇到了相同的(?)问题!没有处理错误,但传输停止。

更新 2: 我不敢相信,但这是真的:SimpleFTPSample来自 Apple 的产品也受到此问题的影响。

最佳答案

这就是 - 解决方案(或更确切地说是解决方法):

您应该将 writeStream 的属性设置为 false,以关闭默认的持久连接

CFWriteStreamSetProperty( (CFWriteStreamRef)writeStreamRef, kCFStreamPropertyFTPAttemptPersistentConnection, kCFBooleanFalse ) ;

关于iphone - 3G网络中NSPOSIXErrorDomain Code=12 "Cannot allocate memory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6072278/

相关文章:

ios - UIScrollView的 "pull up to load more"和 “pull down to go back"导致闪烁(附示例代码)

javascript - 没有调用Parse.Installation beforeSave

c - 结构体中数组的内存分配

r - 如何使用 R 在基于代理的建模中管理内存

iphone - 是否可以确定 ViewController 是否呈现为模态?

iphone - 是否有适用于 ‘With Friends’ 游戏的 iOS API?

iphone - Xcode自动将对象转换为NSArray

iphone - 在 applicationDidBecomeActive 上刷新 ios UIViewController

objective-c - 是否可以控制 Yosemite 中半透明/模糊背景的活力?

r - 即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?