iOS发布了大型uint8_t []数组

时间:2012-12-05 10:43:43

标签: iphone objective-c ios xcode

实际上,我接收的大字节数组长度只有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上运行

请帮忙。感谢

2 个答案:

答案 0 :(得分:1)

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

<强>更新

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

uint8_t t[_sz];

对于这样的事情:

uint8_t t[CHUNK_SIZE];

其中CHUNK_SIZE可能是合理的,比如几KB。

答案 1 :(得分: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,你使用它们的方式会产生各种问题。