修改字符串后EXC_BAD_ACCESS

时间:2010-01-18 00:12:11

标签: iphone string exception

我通过删除大块字符来操作一个大字符串,并将新字符串分配回原始字符串。

articleString = [articleString stringByReplacingCharactersInRange:startRange withString:@""];

articleString是NSMutableString类型的实例变量

这在我第一次浏览此代码时似乎工作正常。但是当我从第二次返回并使用变量articleString时,我得到一个EXC_BAD_ACCESS异常。

这些是长字符串 - 最多100K字节。

为什么我得到例外的任何想法?

2 个答案:

答案 0 :(得分:2)

stringByReplacingCharactersInRange:startRange将返回NSString类型的副本。 (不是NSMutableString)
你想用:
- (void)replaceCharactersInRange:(NSRange)aRange withString :( NSString *)aString代替。

stringByReplacingCharactersInRange:startRange返回一个自动释放的NSString,因此如果articleString是一个成员变量,则必须在其上调用retain。

答案 1 :(得分:1)

请发布整个代码块,以便我们弄清楚发生了什么:)

我的猜测是,这种情况正在发生,因为方法块中有autorelease,然后将其分配回原始变量。如果要使用静态stringWithFormat创建一个新字符串,或者使用该字符串autorelease创建一个新字符串,无论您使用它做什么,都会在退出代码块时减少它的引用计数器。这意味着如果您将其分配回原始字符串,您的原始字符串将在第二次释放,从而导致您的EXE_BAD_ACCESS。

在这种情况下,解决方案是改变现有的NSMutableString,或保留字符串并在以后安全时释放它。例如,使用replaceCharactersInRange:withString:可能会解决问题。