iPhone SDK:替换字符串出现时出错

时间:2010-11-16 16:56:48

标签: iphone nsstring nsdata exc-bad-access

我正在尝试用几个不同的步骤替换字符串的出现,我正在使用:

NSString *doc = [[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding];
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord];
doc = [doc stringByReplacingOccurrencesOfString:@"###NAME###" withString:ride.title];
doc = [doc stringByReplacingOccurrencesOfString:@"###DESC###" withString:ride.description];

[doc release];

我首先从文件中获取文本,并希望用自己的文件替换一些字符串。但是,运行此命令时出现以下错误:

Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 13059]
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)

我不明白为什么我收到EXC_BAD_ACCESS错误。我试图发布的内容已经发布了什么?!

1 个答案:

答案 0 :(得分:2)

NSString *doc = [[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding];
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord];

当你在第二行分配给doc时,你将失去对最初创建的字符串的引用。

[doc release];

在最后一行中,当您释放字符串时,您不会释放原始字符串。你正在释放它现在的任何东西,这是前一行的结果。所以原始字符串泄漏,你过度发布替换,并且过度发布会导致崩溃。您可以在创建原始字符串时自动释放原始字符串(并删除最后的release调用),也可以对您在中间使用的修改后的字符串使用不同的临时字符串。

例如,将代码更改为:

NSString *doc = [[[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding] autorelease];
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord];
doc = [doc stringByReplacingOccurrencesOfString:@"###NAME###" withString:ride.title];
doc = [doc stringByReplacingOccurrencesOfString:@"###DESC###" withString:ride.description];

它不会泄漏。如果在此之后它仍然崩溃,则崩溃将来自不同的原因(例如您之后使用该字符串而没有在某处保留它。)GDB是您的朋友 - 检查它的回溯中的内容。