2010-01-18 134 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:可以解決問題。