0

实际上,我收到了长达 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 数组的大小声明为 800000 为 uint8_t[800000]; 然后它可以在我的 iOS 模拟器中运行,但不能在我的 iPad 上运行

请帮忙。谢谢

4

2 回答 2

1

这条线在我看来是错误的:

  • (NSString *) recvToFile:(NSString *)_fileName: (long)_sz {

你应该有类似的东西: + (ReturnType *) methodname:(Type) _var1 secondArg:(type) _var2

所以也许你想要: + (NSString *) recvToFile:(NSString *)_fileName size:(long)_sz

我认为你遇到崩溃的原因是你试图读取一个名为 _sz 的变量。通过将其更改为固定值,您不会在此处阅读它,并且奇迹般地您的其余代码正在运行。

查看您的代码,我认为您可能需要复习一些客观 C 语法的基础知识。也许您更熟悉另一种语言?我的 iOS 同事告诉我,在目标 C 中很少使用 try 和 catch,而您使用它们的方式可能会产生各种问题。

于 2012-12-05T13:46:08.027 回答
1

您很可能会用完堆栈空间。即使您在堆上分配内存,对于 iOS 设备来说 35MB 也是相当多的。您应该将数据写入文件而不是内存缓冲区。

更新:

所以看起来这段代码已经可以将数据分块并将其分成小块写入文件。你所要做的就是改变这个:

uint8_t t[_sz];

对于这样的事情:

uint8_t t[CHUNK_SIZE];

哪里CHUNK_SIZE可以是一些合理的东西,比如几 KB。

于 2012-12-05T11:28:20.063 回答