1

NSStringC# を使用して作成されたバイトからを抽出できる BinaryReader クラスを Objective-C で作成しましBinaryWriter.Write(string)た。それはうまくいくようですが、私が呼び出すと:

    BinaryReader *binaryReader = [[BinaryReader alloc] initWithData:dataArray];
    NSString *strName = [binaryReader readString];
    // strName is not nil, but the value is no longer correct (seems to have been erased)

私は readString メソッドに足を踏み入れましたが、メソッドが戻るまで (ARC が作動していると思います)、すべてがうまくいっています (文字列は正しいです)。

なぜこれが起こるのでしょうか?

ここに私の readString メソッドがあります:

-(NSString *)readString
{
    NSUInteger bytesCount = (NSUInteger)[self read7BitEncodedInt];
    const void *byteData = [_data bytes] + _dataIndex;

    NSString *returnValue =
        [[NSString alloc] initWithBytes:byteData length:bytesCount encoding:NSUTF8StringEncoding];

    _dataIndex += bytesCount;
    return returnValue;
}

にはreturnValue、メソッドが戻る直前に適切な文字列が含まれています。

リクエストにより、BinaryReader の初期化関数を以下に示します。

-(id)initWithData:(NSData *)theData
{
    self=[super init];
    if(self != nil)
    {
        _dataIndex = 0;
        _data = theData;
    }
    return self;
}

およびヘッダーの関連部分

@interface BinaryReader : NSObject
{
    @private
    NSData *_data;
    int _dataIndex;
}
4

3 に答える 3

2

結果が実際に壊れていると確信していますか? 投稿したコードは問題ないようで、ARC でコンパイルした場合、所有権やメモリの問題は発生しないはずです。

最近、場合によっては lldb (デバッガー) が正しい値を表示しないという問題が報告されています。を使用して結果を記録してみてくださいNSLog

于 2012-11-13T09:59:19.227 に答える
0

ARCはオブジェクトをすぐに解放するべきではないため、エラーはreadString自体の内部にある可能性があります。

于 2012-11-13T09:27:51.770 に答える
-2

binaryReader を strong 属性を持つプロパティとして配置すると、問題が解決する場合があります。

@propert(nonatomic, strong) BinaryReader* binaryReader;

オブジェクトを解放しないようにコンパイルに指示します。

于 2012-11-13T09:47:15.583 に答える