EXC_BAD_ACCESS после изменения строки - PullRequest
0 голосов
/ 18 января 2010

Я манипулирую большой строкой, удаляя куски символов и назначая новую строку обратно исходной строке.

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

articleString - переменная экземпляра типа NSMutableString

Кажется, это работает нормально, когда я в первый раз просматриваю этот код.Но когда я возвращаюсь со второго раза и использую переменную articleString, я получаю исключение EXC_BAD_ACCESS.

Это длинные строки - до 100 Кбайт.

Есть идеи, почему я получаю исключение?

Ответы [ 2 ]

2 голосов
/ 18 января 2010

stringByReplacingCharactersInRange: startRange возвращает копию типа NSString. (Не NSMutableString)
Вы хотите использовать:
- (void) replaceCharactersInRange: (NSRange) aRange withString: (NSString *) aString вместо.

stringByReplacingCharactersInRange: startRange возвращает автоматически выпущенную строку NSString, поэтому вам придется вызывать retain для нее, если articleString является переменной-членом.

1 голос
/ 18 января 2010

Пожалуйста, опубликуйте весь блок кода, чтобы мы могли выяснить, что происходит:)

Я предполагаю, что это происходит из-за autorelease в вашем блоке метода и последующем присвоении его исходной переменной. Если вы создаете новую строку со статической stringWithFormat или autorelease этой строкой, независимо от того, что вы с ней делаете, счетчик ссылок будет уменьшен при выходе из блока кода. Это означает, что если вы присваиваете ее исходной строке, ваша исходная строка будет освобождена во второй раз, что приведет к вашей EXE_BAD_ACCESS.

Решением в этом случае было бы либо изменить существующий NSMutableString, либо сохранить строку и освободить ее позже, когда это будет безопасно. Например, использование replaceCharactersInRange:withString: может решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...