我从静态分析器中获取此行可能泄露的对象错误:
strCleanPhone = [[[[strPhone stringByReplacingOccurrencesOfString:@" " withString:@""]
stringByReplacingOccurrencesOfString:@"(" withString:@""]
stringByReplacingOccurrencesOfString:@")" withString:@""]
stringByReplacingOccurrencesOfString:@"-" withString:@""];
首先,这是从电话号码字符串中删除非数字字符的首选方式吗?
二,你能否解释为什么这会是一个泄漏的对象?
答案 0 :(得分:2)
由stringByReplacingOccurrencesOfString
创建的字符串是自动释放的,因此它们不会泄露。如果发生泄漏,则与strPhone
和strCleanPhone
。
例如,如果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:发布更多代码。)