2010-09-03 54 views
0

我發現了從靜態分析器潛在泄漏的對象錯誤此行:潛在泄露對象錯誤

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

對於一個,然而這是剝離從電話號碼字符串非數字字符的優選方式?

二,你能解釋爲什麼這會是一個泄漏的對象嗎?

回答

2

stringByReplacingOccurrencesOfString創建的字符串是autoreleased,因此它們不會泄漏。如果發生泄漏,它與strPhonestrCleanPhone有關。

例如,如果strCleanPhone是帶有retain選項的@property,並且當前不是零,那麼您的代碼會泄漏它。要使用合成生成的發佈/保留代碼,必須使用屬性語法:self.strCleanPhone = ...。僅使用strCleanPhone = ...即可設置實例變量,不會釋放它指向的任何對象。

+0

你說得對,問題在於使用strPhone。我嵌套了返回保留對象的核心基礎函數。因爲他們是嵌套的,他們沒有被釋放。 – 2010-09-03 18:53:33

+0

還有一件事,你能詳細說明使用self.property = nil和[property release]之間的區別嗎?假設它們是相同的,我錯了嗎? – 2010-09-03 18:55:58

+0

從發佈的角度來看它是等價的。如果你繼承,他們可能會有不同的行爲。另外,如果你改變了它的屬性,那麼設置爲零可能不再合適。最後,我認爲KVO功能是通過設置觸發的,但不是通過釋放(不確定)。 http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html - 基本上,如果你只關心釋放,那麼設置爲nil是等價的。 – 2010-09-03 19:46:15

1

如果您使用的是iOS 4.0+,則可以使用新的NSRegularExpression對象來更優雅一些。

您發佈的代碼不會泄漏。它只創建四個自動發佈的字符串對象。

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

但我建議尋找正則表達式。

1

確保通過單擊源視圖中的警告文本來擴展分析儀警告!有可能是指向最後引用變量的地方;如果展開警告,您將看到一堆指示代碼流的箭頭,這將有助於指示您已將可能泄漏的對象分配到哪裏。

(tl; dr:發佈更多代碼。)