实际上,我接收的大字节数组长度只有35 mb。该字节数组是pdf文档的字节。我从tcp套接字输入流接收到这个 我使用的代码是
+ (NSString *) recvToFile:(NSString *)_fileName: (long)_sz {
@try {
uint8_t t[_sz];
NSMutableData *data = nil;
NSMutableData *fileData = [[NSMutableData alloc] init];
long _pos = 0;
NSString *_fullPath = [Misc createTempFile:_fileName];
while (_sz > _pos) {
long _c = [m_sin read:t maxLength:_sz];
_pos += _c;
data = [NSData dataWithBytes:t length:_c];
if([Misc checkTempFileExists:_fileName]==nil)
[[NSFileManager defaultManager] createFileAtPath:_fullPath contents:nil attributes:nil];
[fileData appendData:data];
}
[fileData writeToFile:_fullPath atomically:YES];
NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:_fullPath error:nil];
NSLog(@"ATTR - %@",attr);
long long length = [[attr valueForKey:@"NSFileSize"] intValue];
if (length >= _sz)
return (_fullPath);
}
@catch (NSException * e) {
}
return (nil);
}
问题是应用程序崩溃,在第一行显示“EXC_BAD_ACCESS(code = 2 address = 0x2461ae4)”错误
+(NSString *) recvToFile:(NSString *)_fileName: (long)_sz
当我明确地将uint8_t数组的大小声明为80000作为uint8_t [800000]; 然后它可以在我的iOS模拟器中运行,但不能在我的iPad上运行
请帮忙。感谢
答案 0 :(得分:1)
您很可能用完了堆栈空间。即使你在堆上分配内存,对于iOS设备来说35MB也是相当多的。您应该将数据写入文件而不是内存缓冲区。
<强>更新强>
所以看起来这段代码已经可以将数据块化并将其写入文件中。你所要做的就是改变这一点:
uint8_t t[_sz];
对于这样的事情:
uint8_t t[CHUNK_SIZE];
其中CHUNK_SIZE
可能是合理的,比如几KB。
答案 1 :(得分:1)
这条线对我来说不对:
你应该有类似的东西: +(ReturnType *)methodname :( Type)_var1 secondArg :( type)_var2
所以也许你想要: +(NSString *)recvToFile:(NSString *)_ fileName size :( long)_sz
我认为您遇到崩溃的原因是您正在尝试读取名为_sz的变量。通过将其更改为固定值,您不会在此处读取它,并且通过一些奇迹,其余代码正在运行。
查看您的代码我认为您可能需要更新一些客观C语法的基础知识。也许你对另一种语言比较熟悉?我的iOS同事告诉我,在目标C中很少使用try和catch,你使用它们的方式会产生各种问题。