2

我知道類似的問題已被問及一次又一次,但我問你,請耐心與我,因爲我似乎無法找到一個有用的答案。NSMutableString泄漏append或replaceOccurrencesOfString

我的應用程序有泄漏導致我不知所云。實際上,他們不會被泄漏泄漏使用,但是我的ObjectAlloc中的淨字節上升,並且永遠不會停止,如果時間足夠長(不是很長),最終會導致崩潰。

問題發生在NSMutableStrings。我認爲有一些基本的東西我不瞭解它們,或者我面臨着另一個問題,那就是我無法追蹤,但一直隱藏在NSMutableStrings之後。具體來說,我注意到,每當我追加或執行替換NSMutableString時,ObjectAlloc報告在調整NSMutableString大小時,場景後面的malloc/frees中出現的不匹配。我很抱歉地說,這是我第二次面臨這個問題 - 第一次我搞砸了幾個小時,最後問題消失了(魔術!),但我不知道爲什麼。

當我看下面的代碼(並相信我,我盯着它幾個小時),我看不到問題。我查看代碼並認爲我應該沒問題,因爲我釋放了我負責的唯一對象(aString),並且NSMutableString應該在任何調整大小後處理清理。在第二個例子中,只要知道它有幫助,傳入的字符串就來自一個ASIHTTPRequest對象(它是responseString),我什麼都不做。它被稱爲就像這樣([自我DoStuff2:[request responseString]]),我也沒有自己釋放請求(我使用ASINetworkQueue,我認爲這些請求被破壞了我(我試過並導致錯誤因爲請求已經在其他地方發佈)

此外,我知道它不應該做任何事情,但我甚至嘗試在autorelease池中包裝代碼,這當然沒有任何作用。因爲NSOperations應該爲自己創建一個自動釋放池,但我已經試過了,但沒有成功。

與NSMutableString沒有關係,但我發現我也有使用NSString組件的類似問題SeparatedByStri ng方法。有時,獲取分離組件的數組所使用的內存永遠不會被釋放。嗯......字符串似乎對我來說似乎有些問題。

我希望任何人都可以提供幫助。如果您需要更多信息,我很樂意添加它。我向你保證,我已經和這個(以及其他問題)鬥爭了幾個星期,每遇到我遇到的每個問題,我都會努力研究,直到找到解決方案 - 這不是一個空閒的請求,而是真正的求救呼聲!我寫了這麼多的代碼,現在我試圖密封一些小的泄漏等,我注意到這個問題。老實說,我無法相信目標C中的內存管理如何讓我時不時地陷入困境......我已經多次閱讀了Apple的內存管理文檔,並且我認爲我完全理解了它,並且試圖努力釋放自己擁有的對象,但是有時候我會發現自己在想我是否真的明白了......我想把它放置一次,並確保我完全理解這一切 - 在編寫成千上萬行代碼之後出現此類問題/問題不止一點嚇人/尷尬/煩人。

再次,如果有人有任何見解,我會很感激。感謝您的時間和努力。

-(void)DoStuff 
{ 
NSString *aString [ [[NSString alloc] initWithFormat:@"text %@ more text", self.strVariable]; 
[self.someMutableStringVar replaceOccurrencesOfString:@"replace" withString:aString options:NSCaseInsensitiveSearch range:NSMakeRange(0, [self.someMutableStringVar length])]; 
[aString release]; 
} 


-(void)DoStuff2:(NSString *)aString 
{ 
[self.someMutableStringVar appendString:aString]; 
} 
+0

'someMutableStringVar'是一個'@ property'嗎?如果是這樣,它是如何定義的?你定義了一個自定義setter嗎? – 2010-05-29 00:18:48

+0

Hi Shaggy Frog, 是的,someMutableStringVar是@synthesized屬性(我使用默認的settter)。 – John 2010-05-29 00:26:55

+0

我想你最好能提供一個完整的例子供我們看看。我在你的代碼中看到了一些奇怪的東西(例如,你爲什麼要用self。來讀取實例自己的變量?),但是沒有看到整體,很難找出一個特定的問題。我希望看到分配,釋放,屬性定義和(當然)泄漏。 :) – 2010-06-04 21:45:17

回答

0

我會建議的第一件事是做構建&分析。這通常可以幫助我找出明顯的錯誤。

+0

嗨Alexsander, 我不得不穀歌!我應該提到我使用xcode 3.1.4(在Leopard上),所以沒有構建和分析功能。然而,谷歌搜索告訴我,分析是由clang執行的,這是我用過並喜愛的工具,之前我的名字我不記得了!感謝您指出。 – John 2010-05-29 00:29:44

+0

做了一個分析,Clang在另一個完全分離的代碼中只發現了一些問題。上面沒有發現問題。再次感謝。 – John 2010-05-29 02:10:36

1

您發佈的代碼正確地遵守Cocoa內存使用指南。但是,您報告的症狀是記憶力增加,而不是泄漏。您如何確定這些是增長髮生的地點?儀器中的ObjectAlloc儀器可能會顯示這些位置是否有大量靜物分配?

如果是這樣的話,我猜你可能會錯過一個自動釋放池。您顯示的代碼有許多操作可能導致對象被自動釋放。如果在這些操作發生時沒有活動的自動釋放池,則該內存將無法正確釋放。如果您在後臺線程中執行了這些操作(未設置autorelease池),則可能會發生這種情況。