ARC很快就会发布

时间:2012-11-13 09:22:19

标签: objective-c ios automatic-ref-counting

我在Objective-C中编写了一个BinaryReader类,它可以从使用C#NSString创建的字节中提取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;
}

3 个答案:

答案 0 :(得分:2)

你确定结果真的坏了吗?您发布的代码似乎很好,使用ARC编译时应该没有所有权/内存问题。

最近报告了lldb(调试器)在某些情况下未显示正确值的问题。尝试使用NSLog记录结果。

答案 1 :(得分:0)

ARC不应该这么快就释放对象,所以你的错误可能在readString本身内。

答案 2 :(得分:-2)

将binaryReader作为具有strong属性的属性,它可以解决您的问题。

@propert(nonatomic, strong) BinaryReader* binaryReader;

它告诉compil不释放对象。