Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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 NSString即使在保留后仍被释放_Objective C_Ios_Cocoa_Memory Management_Nsstring - Fatal编程技术网

Objective c NSString即使在保留后仍被释放

Objective c NSString即使在保留后仍被释放,objective-c,ios,cocoa,memory-management,nsstring,Objective C,Ios,Cocoa,Memory Management,Nsstring,我保留了一个NSString,我发布它的唯一地方是dealoc方法。然而,出于某种原因,在程序的稍后部分,当我尝试引用它时(特别是它的长度),我得到了一个崩溃,说[CFString length]:发送到释放实例0xff32c50的消息 我在程序的前面明确地保留了字符串。这有什么原因吗?感谢您的帮助 字符串entityParameter在标头中声明,稍后定义。 下面是一些代码: entityParameter=[[EntitySearchWindowStringByEvaluatingJavaS

我保留了一个NSString,我发布它的唯一地方是dealoc方法。然而,出于某种原因,在程序的稍后部分,当我尝试引用它时(特别是它的长度),我得到了一个崩溃,说[CFString length]:发送到释放实例0xff32c50的消息

我在程序的前面明确地保留了字符串。这有什么原因吗?感谢您的帮助

字符串entityParameter在标头中声明,稍后定义。 下面是一些代码:
entityParameter=[[EntitySearchWindowStringByEvaluatingJavaScriptFromString:@“f();“]retain]

我撞车的地方是这样的:
if([entityParameter length]!=0&&entityParameter!=nil)
{
返回;
}

我保留了一个NSString, 我唯一能释放它的地方就是 dealoc方法。出于某种原因, 但是后来在节目里我 试着引用它(它的长度, 具体地说),我会崩溃,说 [CFString length]:发送到的消息 解除分配的实例0xff32c50

显然,它没有被保留

如果“保留”是指“分配给财产”,您是否在做:

self.prop = [NSString ...];
或:

因为前者将保留(如果属性声明为
retain
),而后者则不会。请注意,NSString属性通常应该声明为
copy
,但这与问题是正交的)

如果您的代码如所写:

entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];
实际上,您只需在
dealloc
中释放它,然后确保您的包含对象尚未被释放。这可能正在发生。或者可能是您在某个地方泄漏了字符串引用,并在没有保留的情况下错误地删除了它

在带有“跟踪保留/释放事件”(或其他称为跟踪保留/释放事件)的仪器中使用僵尸检测应该会显示对象上的每个最后保留/释放事件,包括爆炸事件

我保留了一个NSString, 我唯一能释放它的地方就是 dealoc方法。出于某种原因, 但是后来在节目里我 试着引用它(它的长度, 具体地说),我会崩溃,说 [CFString length]:发送到的消息 解除分配的实例0xff32c50

显然,它没有被保留

如果“保留”是指“分配给财产”,您是否在做:

self.prop = [NSString ...];
或:

因为前者将保留(如果属性声明为
retain
),而后者则不会。请注意,NSString属性通常应该声明为
copy
,但这与问题是正交的)

如果您的代码如所写:

entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];
实际上,您只需在
dealloc
中释放它,然后确保您的包含对象尚未被释放。这可能正在发生。或者可能是您在某个地方泄漏了字符串引用,并在没有保留的情况下错误地删除了它



在带有“跟踪保留/释放事件”(或其他名称)的仪器中使用僵尸检测应该会显示对象上的每一个保留/释放事件,包括爆炸事件。

如果没有看到一些代码,这是不可能回答的。如果可以,请发布代码,以便我们可以看到您的错误。此外,如果您使用XCode4,请转到产品->分析,并查找任何早期发布警告。您已经使用了分析工具,没有什么不寻常的地方。您是否已经确认entityParameter在评估后不为零?您不需要在条件中同时进行这两项检查;如果
entityParameter
nil
,那么
length
无论如何都会给你0。如果没有看到一些代码,这是不可能回答的。如果可以,请发布代码,以便我们可以看到你做错了什么。此外,如果您使用XCode4,请转到产品->分析,并查找任何早期发布警告。您已经使用了分析工具,没有什么不寻常的地方。您是否已经确认entityParameter在评估后不为零?您不需要在条件中同时进行这两项检查;如果
entityParameter
nil
,那么
length
无论如何都会给你0;[全参数保留]
将尝试在instruments中使用track retain/release事件。更新:以下是运行zombie instrument后分析的屏幕截图。不知道该怎么办。好吧,我解决了,虽然这是一个很糟糕的解决方案。问题是这个方法被调用了五次,在第一次运行之后,字符串由于某种原因被自动释放。我只是在方法本身中添加了另一个retain,所以每次它都会保留另一个对自身的引用,然后在dealloc中解除分配之前自动释放其中一个引用。这没有意义,并且指示另一个bug。请发布该方法的正文。@Mason:没有“出于某种原因自动删除”。自动释放是一种行为,而不是随机发生的事件。在仪器中,查看这些事件的堆栈跟踪。我想到了两个问题:(1)您说字符串是由
stringByEvaluatingJavaScriptFromString:
创建的,但Instruments显示
stringWithFormat:
。为什么呢?(2) GraphicsServices与此字符串有什么关系?堆栈跟踪将告诉(或至少引导您)这两个问题的答案;[全参数保留]将尝试在instruments中使用track retain/release事件。更新:以下是运行zombie instrument后分析的屏幕截图。不知道该怎么办。好吧,我解决了,虽然这是一个很糟糕的解决方案