NSPOSIXErrorDomain Code=12 在 3G 网络中“无法分配内存”

kon*_*owy 5 memory iphone ftp posix objective-c

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

\n\n
\n

错误域=NSPOSIXErrorDomain\n 代码=12“操作无法完成\xe2\x80\x99。无法分配内存”

\n
\n\n

下面是出现错误的代码:

\n\n
- (void)stream:(NSStream*)aStream handleEvent:(NSStreamEvent)eventCode {\n\n    switch( eventCode ) {\n        case NSStreamEventHasSpaceAvailable: {\n            if( _readDataOffset == _readDataLimit ) {\n                NSInteger readDataLen = [_readStream read:[_readData mutableBytes] maxLength:kReadDataLength];\n                NSLog(@"readDataLen is %d",readDataLen);\n                if( -1 == readDataLen ) {\n                    _error = [[_readStream streamError] retain];\n                    _keepRunning = NO;\n                } else if( 0 == readDataLen ) {\n                    _keepRunning = NO;\n                } else {\n                    _readDataOffset = 0;\n                    _readDataLimit = readDataLen;\n                }\n            }\n\n            if( _readDataOffset != _readDataLimit ) {\n                NSOutputStream* writeStream = (NSOutputStream*)aStream;\n\n                uint8_t *buffer = (void *)[_readData bytes];\n\n          // vvvv and here  the value of writtenDataLen is often -1 (but only on 3G network)\n                NSInteger writtenDataLen = [writeStream write:&buffer[_readDataOffset] maxLength:_readDataLimit - _readDataOffset]; \n\n\n                if( writtenDataLen > 0 ) {\n                    _readDataOffset += writtenDataLen;\n                    _writtenDataLen += writtenDataLen;\n                    [self ftpPutDidWriteInternal];\n                } else if( -1 == writtenDataLen ) {\n                    _error = [[writeStream streamError] retain];\n                    _keepRunning = NO;\n                }\n            }\n\n        } break;\n        case NSStreamEventErrorOccurred: {\n            _error = [aStream.streamError retain];\n            _keepRunning = NO;\n        } break;\n    }    \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n

kon*_*owy 1

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

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

CFWriteStreamSetProperty( (CFWriteStreamRef)writeStreamRef, kCFStreamPropertyFTPAttemptPersistentConnection, kCFBooleanFalse ) ;
Run Code Online (Sandbox Code Playgroud)