Как сказал Squeegy, все приведенные выше методы возвращают автоматически выпущенные объекты. Второй пример кода завершится сбоем, потому что вы перевыпускаете строковые объекты.
Squeegy указал один из способов справиться с этим, используя NSMutableStrings. Я бы порекомендовал такой подход. Например, следующая перезапись вашего метода:
-(NSString*) unescape:(NSString*)string
{
NSMutableString *unescapedString = [[NSMutableString alloc] initWithString:string];
[unescapedString replaceOccurrencesOfString:@"'" withString:@"'" options:0 range:NSMakeRange(0, [unescapedString length])];
[unescapedString replaceOccurrencesOfString:@"&" withString:@"&" options:0 range:NSMakeRange(0, [unescapedString length])];
[unescapedString replaceOccurrencesOfString:@""" withString:@"\"" options:0 range:NSMakeRange(0, [unescapedString length])];
[unescapedString replaceOccurrencesOfString:@">" withString:@">" options:0 range:NSMakeRange(0, [unescapedString length])];
[unescapedString replaceOccurrencesOfString:@"<" withString:@"<" options:0 range:NSMakeRange(0, [unescapedString length])];
return [unescapedString autorelease];
}
возвращает только автоматически выпущенную NSMutableString в конце.
Еще лучше было бы, если бы вы передали указатель на указатель NSMutableString (NSMutableString **). Таким образом, вы можете изменить строку, созданную вне вашего метода, без создания новой временной строки. Если это кажется странным, взгляните на методы, которые работают с экземплярами NSError.
РЕДАКТИРОВАТЬ: игнорировать мое заявление о необходимости двойного указателя в предыдущем абзаце. Как указывает erikprice, вам просто нужно передать указатель NSMutableString. Двойной указатель необходим только в том случае, если вы создаете новый экземпляр NSMutableString в своем методе для замены передаваемого, что здесь не так.