代码之家  ›  专栏  ›  技术社区  ›  Jesse Bunch

潜在泄漏对象错误

  •  0
  • Jesse Bunch  · 技术社区  · 14 年前

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

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

    第二,你能解释一下为什么这是一个泄露的物体吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Lou Franco    14 年前

    stringByReplacingOccurrencesOfString 是自动释放的,所以不会泄露。如果有漏洞,那一定是因为 strPhone strCleanPhone .

    strCleanPhone公司 是带有retain选项的@property,并且当前不是nil,那么您的代码就会泄漏它。要使用synthesis生成的release/retain代码,必须使用属性语法: self.strCleanPhone = ... . 使用just strCleanPhone = ... 设置实例变量,不释放它所指向的任何对象。

        2
  •  1
  •   Ben Zotto sberry    14 年前

    如果您使用的是iOS 4.0+,那么您可能可以使用新的 NSRegularExpression

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

        3
  •  1
  •   tidwall    14 年前

    如果你想去掉不是数字的字符。

    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];
    }
    

        4
  •  1
  •   Wevah    14 年前

    确保通过单击源代码视图中的警告文本来展开analyzer警告!它很可能指向变量最后一次引用的位置;如果展开警告,您将看到一组指示代码流的箭头,这将有助于指示您在哪里分配了可能泄漏的对象。

    太长了,读不下去了。