2010-01-18 98 views
0

EXC_BAD_ACCESS我通过删除字符块并将新字符串分配回原始字符串来操纵大字符串。EXC_BAD_ACCESS修改字符串

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

articleString是类型的实例变量的NSMutableString

这似乎做工精细,我第一次经历这种代码。但是当我第二次返回并使用变量articleString时,我得到一个EXC_BAD_ACCESS异常。

这些是长字符串 - 高达100K字节。

任何想法,为什么我得到异常?

+0

小心!你需要记住'stringByReplacingCharactersInRange:withString:'将总是返回一个不可变的字符串('NSString'),而不管你声明变量是什么。 – dreamlax 2010-01-18 00:28:38

+0

谢谢。使用replaceCharactersInRange照顾了这个问题。 – 2010-01-18 00:41:55

回答

2

stringByReplacingCharactersInRange:startRange将返回NSString类型的副本。 (Not NSMutableString)
要使用:
- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString代替。

stringByReplacingCharactersInRange:startRange返回一个自动释放的NSString,所以如果articleString是一个成员变量,你将不得不调用retain。

1

请张贴整个代码块,所以我们可以弄清楚发生了什么:)

我的猜测是,这是因为你的方法块内的autorelease的发生,然后分配回原来的变量。如果要使用静态的stringWithFormatautorelease这个字符串创建一个新字符串,则无论您如何处理它,在退出代码块时都会使其引用计数器递减。这意味着,如果您将其分配回原始字符串,您的原始字符串现在将第二次释放,从而导致您的EXE_BAD_ACCESS。

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