Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 电弧释放过快_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Objective c 电弧释放过快

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

我用Objective-C编写了一个BinaryReader类,它可以从使用C的BinaryWriter.Write(string)创建的字节中提取一个
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)。但愿我能给你多投一票