我在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;
}
答案 0 :(得分:2)
你确定结果真的坏了吗?您发布的代码似乎很好,使用ARC编译时应该没有所有权/内存问题。
最近报告了lldb(调试器)在某些情况下未显示正确值的问题。尝试使用NSLog
记录结果。
答案 1 :(得分:0)
ARC不应该这么快就释放对象,所以你的错误可能在readString本身内。
答案 2 :(得分:-2)
将binaryReader作为具有strong属性的属性,它可以解决您的问题。
@propert(nonatomic, strong) BinaryReader* binaryReader;
它告诉compil不释放对象。