我有一个我保留的NSString,我释放它的唯一地方是dealloc方法。但是,出于某种原因,稍后在程序中我尝试引用它(具体来说是它的长度)时,我得到一个崩溃,说[CFString length]:消息发送到解除分配的实例0xff32c50。
我在程序的前面明确地保留了字符串。有什么理由会发生这种情况吗?任何帮助表示赞赏。
字符串entityParameter在标头中声明,稍后定义。
以下是一些代码:
entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];
我遇到崩溃的地方如下:
if([entityParameter length] != 0 && entityParameter != nil)
{
return;
}
答案 0 :(得分:5)
我有一个我保留的NSString, 而我发布它的唯一地方就是 dealloc方法。由于某些原因, 但是,后来在我的节目中 试着引用它(它的长度, 特别是,我得到了一个崩溃,说 [CFString length]:发送给的消息 解除分配的实例0xff32c50。
显然,它没有被保留。
如果“保留”是指“分配给某个财产”,您在做什么:
self.prop = [NSString ...];
或者:
prop = [NSString ...];
因为前者将保留(如果属性声明为retain
),而后者则不会。请注意,NSString属性通常应声明为copy
,但这与问题正交。)
如果你的代码是这样写的:
entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];
你真的只在release
中dealloc
,然后确保你的包含对象尚未被释放。这可能正在发生。或者可能是你在某处泄露了字符串引用并在没有保留的情况下虚假地删除了它。
在具有“轨道保留/释放事件”(或其任何名称)的仪器中使用Zombie检测应该显示对象上的每个最后一次保留/释放事件,包括爆炸事件。