1

我在 Objective-C 中编写了一个 BinaryReader 类,它可以NSString从使用 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 回答