2010-01-18 4 views
0

대용량 문자열을 제거하고 원래 문자열에 새 문자열을 다시 할당하여 조작하고 있습니다.문자열을 수정 한 후 EXC_BAD_ACCESS

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

articleString는 인 NSMutableString가

이 잘 나는이 코드를 통해 이동 처음으로 작동하는 것 같다 유형의 인스턴스 변수입니다. 하지만 두 번째 시간부터 돌아가서 articleString 변수를 사용하면 EXC_BAD_ACCESS 예외가 발생합니다.

이들은 긴 문자열입니다 (최대 100K 바이트).

예외가 발생하는 이유는 무엇입니까? 우리가

내 생각 엔이 원래 변수에 할당 한 후 때문에 당신의 방법 블록 내부 autorelease의 일이되고 있다는 것입니다 :) 무슨 일이 일어나고 있는지 알아낼 수 있도록

+0

조심하세요! 'stringByReplacingCharactersInRange : withString :'은 변수를 선언 한 것과 관계없이 항상 불변의 문자열 ('NSString')을 반환한다는 것을 기억해야합니다. – dreamlax

+0

감사합니다. replaceCharactersInRange를 사용하면 문제가 해결되었습니다. –

답변

2

stringByReplacingCharactersInRange : startRange는 NSString 형식의 복사본을 반환합니다. (NSMutableString이 아님)
당신이 사용하고자하는 :
- (void) replaceCharactersInRange : (NSRange) aRange withString : (NSString *) aString.

stringByReplacingCharactersInRange : startRange는 autoreleased NSString을 반환하므로 articleString이 멤버 변수 인 경우 retain을 호출해야합니다.

1

전체 코드 블록을 게시하시기 바랍니다. stringWithFormat 또는 문자열이 autorelease 인 정적 문자열을 사용하여 새 문자열을 만드는 경우 코드 블록을 종료 할 때 참조 카운터가 감소합니다. 즉, 원래 문자열로 다시 지정하면 원래 문자열이 두 번째로 해제되어 EXE_BAD_ACCESS가 발생합니다.

이 경우 솔루션은 기존 NSMutableString을 변경하거나 문자열을 유지 한 다음 안전 할 때 나중에 해제하는 것입니다. 예를 들어 replaceCharactersInRange:withString:을 대신 사용하면 문제를 해결할 수 있습니다.

관련 문제