当前位置:  开发笔记 > 编程语言 > 正文

字符串操作没有内存泄漏?

如何解决《字符串操作没有内存泄漏?》经验,为你挑选了2个好方法。

我想做一系列字符串替换来删除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
}     

但那是非常丑陋的代码.编写此代码以进行多次替换的最佳方法是什么?你会怎么做?



1> Alex Wayne..:

任何通过不init以字开头或包含该字的方法返回新对象的cocoa方法都copy将返回一个自动释放的对象.所以上面的代码应该没有漏洞.

虽然在这里使用NSMutableString可能更容易.然后你只需修改字符串,而不是创建一堆自动释放的字符串对象,这应该使事情更清洁.

另外,你迭代的映射字典怎么样,找到key并替换value每个项目.甚至可以将其保存为您应用中的plist,以便以后轻松调整.



2> Brad Larson..:

正如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实例来替换传入的实例时才需要双指针,这不是这里的情况.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有