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

スタックスペースが不足している可能性があります。ヒープにメモリを割り当てたとしても、iOSデバイスでは35MBがかなりの量になります。データは、メモリ内のバッファではなくファイルに書き出す必要があります。

アップデート:

したがって、このコードはすでにデータをチャンク化し、ファイルに小さな断片で書き込むことができるようです。あなたがしなければならないのはこれから変更することです:

uint8_t t[_sz];

このようなものに:

uint8_t t[CHUNK_SIZE];

CHUNK_SIZE数KBのような合理的なものがどこにあるか。

于 2012-12-05T11:28:20.063 に答える
1

この行は私には間違っているように見えます:

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

次のようなものが必要です: + (ReturnType *) methodname:(Type) _var1 secondArg:(type) _var2

+ (NSString *) recvToFile:(NSString *)_fileName size:(long)_sz

クラッシュが発生する理由は、_sz という変数を読み込もうとしているからだと思います。これを固定値に変更すると、ここでそれを読んでいるわけではなく、奇跡的にコードの残りの部分が実行されます。

あなたのコードを見ると、目的の C 構文のいくつかの基本について復習する必要があると思います。多分あなたは他の言語にもっと精通していますか?iOS の同僚から、try と catch は Objective C ではめったに使用されず、それらの使用方法によってさまざまな問題が発生する可能性があると言われました。

于 2012-12-05T13:46:08.027 に答える