NSString即使在被保留后也会被释放

Mas*_*son 0 cocoa memory-management objective-c nsstring ios

我有一个我保留的NSString,我释放它的唯一地方是dealloc方法.但是,出于某种原因,稍后在程序中我尝试引用它(具体来说是它的长度)时,我得到一个崩溃,说[CFString length]:消息发送到解除分配的实例0xff32c50.

我在程序的早期明确地保留了字符串.有什么理由会发生这种情况吗?任何帮助表示赞赏.

字符串entityParameter在标头中声明,稍后定义.以下是一些代码: entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];

我遇到崩溃的地方看起来像这样: if([entityParameter length] != 0 && entityParameter != nil) { return; }

bbu*_*bum 5

我有一个我保留的NSString,我释放它的唯一地方是dealloc方法.但是,出于某种原因,稍后在程序中我尝试引用它(具体来说是它的长度)时,我得到一个崩溃,说[CFString length]:消息发送到解除分配的实例0xff32c50.

显然,它不会被保留.

如果"保留"是指"分配给某个财产",你在做什么:

self.prop = [NSString ...];
Run Code Online (Sandbox Code Playgroud)

要么:

prop = [NSString ...];
Run Code Online (Sandbox Code Playgroud)

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

如果您的代码是书面的:

entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];
Run Code Online (Sandbox Code Playgroud)

而且你真的只做releasedealloc,然后确保你的包含对象尚未被释放.这可能正在发生.或者可能是你在某处泄露了字符串引用并在没有保留的情况下虚假删除了它.

在具有"轨道保留/释放事件"(或其任何调用事件)的仪器中使用僵尸检测应该向您显示对象上的每个最后一次保留/释放事件,包括爆炸事件.