我想做一系列字符串替换来删除xml-escaped chars,例如'&'
.
1)是否有现成的UIKit功能可以做到这一点?
2)如果没有,在没有泄漏记忆的情况下,最好的方法是什么?这是个主意:
-(NSString*) unescape:(NSString*)string { string = [string stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; string = [string stringByReplacingOccurrencesOfString:@"&" withString:@"&"]; string = [string stringByReplacingOccurrencesOfString:@""" withString:@"\""]; string = [string stringByReplacingOccurrencesOfString:@">" withString:@">"]; string = [string stringByReplacingOccurrencesOfString:@"<" withString:@"<"]; return string; }
但是,每次分配都不会泄漏内存吗?或者stringByReplacingOccurrencesOfString是否返回自动释放的字符串?我们如何确认stringByReplacingOccurrencesOfString字符串是自动释放的?或者我们应该用它们包装[... autorelease]
?
即使它们是自动释放的,也最好避免在iPhone上自动释放.(见这里).那么我们会这样做:
-(NSString*) unescape:(NSString*)string { NSString* string2 = [string stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; // don't release 'string' because we didn't allocate or retain it NSString* string3 = [string2 stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; [string2 release]; NSString* string4 = [string3 stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; [string3 release]; //...and so on }
但那是非常丑陋的代码.编写此代码以进行多次替换的最佳方法是什么?你会怎么做?
任何通过不init
以字开头或包含该字的方法返回新对象的cocoa方法都copy
将返回一个自动释放的对象.所以上面的代码应该没有漏洞.
虽然在这里使用NSMutableString可能更容易.然后你只需修改字符串,而不是创建一堆自动释放的字符串对象,这应该使事情更清洁.
另外,你迭代的映射字典怎么样,找到key
并替换value
每个项目.甚至可以将其保存为您应用中的plist,以便以后轻松调整.
正如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实例来替换传入的实例时才需要双指针,这不是这里的情况.