潜在的泄漏对象错误

时间:2010-09-03 16:55:54

标签: iphone objective-c memory-management

我从静态分析器中获取此行可能泄露的对象错误:

strCleanPhone = [[[[strPhone stringByReplacingOccurrencesOfString:@" " withString:@""] 
                           stringByReplacingOccurrencesOfString:@"(" withString:@""] 
                          stringByReplacingOccurrencesOfString:@")" withString:@""] 
                         stringByReplacingOccurrencesOfString:@"-" withString:@""];

首先,这是从电话号码字符串中删除非数字字符的首选方式吗?

二,你能否解释为什么这会是一个泄漏的对象?

4 个答案:

答案 0 :(得分:2)

stringByReplacingOccurrencesOfString创建的字符串是自动释放的,因此它们不会泄露。如果发生泄漏,则与strPhonestrCleanPhone

有关

例如,如果strCleanPhone是带有retain选项的@property,并且当前不是nil,那么您的代码会泄漏它。要使用由synthesize生成的发布/保留代码,您必须使用属性语法:self.strCleanPhone = ...。仅使用strCleanPhone = ...设置实例变量,并且不释放它指向的任何对象。

答案 1 :(得分:1)

如果您使用的是iOS 4.0+,则可以使用新的NSRegularExpression对象来更优雅地执行此操作。

您发布的代码不会泄漏。它只创建了四个自动释放的字符串对象。

答案 2 :(得分:1)

如果您要删除不是数字的字符。

NSString *strPhone = @"(555) 444-3333";
NSMutableString *strCleanPhone = [NSMutableString string];
for (int i=0;i<[str length];i++)
{
    unichar ch = [str characterAtIndex:i];
    if (isnumber(ch)) [strCleanPhone appendFormat:@"%c", ch];
}

但我建议查看正则表达式。

答案 3 :(得分:1)

确保通过单击源视图中的警告文本来扩展分析器警告!它可能指向变量最后被引用的位置;如果你展开警告,你会看到一堆箭头指示代码流,这将有助于指出你分配潜在泄漏对象的位置。

(tl; dr:发布更多代码。)