Objective c 电弧释放过快
我用Objective-C编写了一个BinaryReader类,它可以从使用C的BinaryWriter.Write(string)创建的字节中提取一个Objective c 电弧释放过快,objective-c,ios,automatic-ref-counting,Objective C,Ios,Automatic Ref Counting,我用Objective-C编写了一个BinaryReader类,它可以从使用C的BinaryWriter.Write(string)创建的字节中提取一个NSString。看起来效果不错,但当我打电话时: BinaryReader *binaryReader = [[BinaryReader alloc] initWithData:dataArray]; NSString *strName = [binaryReader readString]; // strName is
NSString
。看起来效果不错,但当我打电话时:
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;
}
ARC不应该这么快释放对象,因此您的错误可能在readString本身内部。将您的binaryReader作为具有强属性的属性,它可能会解决您的问题
@propert(nonatomic, strong) BinaryReader* binaryReader;
它告诉编译器不要释放该对象。您确定结果确实被破坏了吗?您发布的代码看起来很好,使用ARC编译时应该没有所有权/内存问题
最近有报告称,lldb(调试器)在某些情况下没有显示正确的值。尝试使用
NSLog
记录结果。您可以显示readString的外观吗?returnValue
的值在方法实际返回之前是正确的。字符串从0x5352525@“HelloWorld”
变为0x5352525 0键/值对
。BinaryReader
对象似乎保持有效,因为如果我再次调用readString
(获取下一个字符串)并进入该方法,它将正确提取,它似乎无法在不删除字符串的情况下返回字符串。默认情况下,自动变量是\uu strong
。你说得对!我输入了一个NSLog(strName)调用readString
之后,我在日志中看到的值是正确的。非常感谢你!而且GRRRR XCODE很快就坏了!不要让我开始;千万个问题,我不得不面对它们!您不会碰巧也知道如何让单元测试停止抛出警告,指出它们没有完成,对吗?在上面找到了大约5个堆栈溢出帖子,但没有解决方案。:)“我输入了一个NSLog(strName);[…]“永远不要这样做!它坏了,很危险。使用NSLog(@“%@”,strName)记录字符串代码>耶,它给我的警告信息提醒我不要这么做。该行不再存在,但如果我要重新添加它,我会使用NSLog(@“%@”,strName)代码>。但愿我能给你多投一票