2012-04-17 62 views
0

我想在我的一個iOS程序中尋找內存泄漏。我覺得我有它釘到一對夫婦類似這些行:何時發佈臨時NSString?

NSString *s1Upper = [s1 uppercaseString]; 
s1Upper = [s1Upper stringByTrimmingCharactersInSet: 
    [NSCharacterSet whitespaceCharacterSet]]; 

(我知道這兩個線不從邏輯角度看是有意義的,剛剛說明了內存的問題,我有)

可以說s1是@「abc」(以空格結尾)。按照我理解NSString的方式,s1Upper在第一行代碼之後指向一個NSString(@「ABC」以空格結尾)。第二行後,它指向一個不同的NSString(@「ABC」沒有空格)。

我的問題:什麼時候發佈第一個NSString?

我的猜測是,噹噹前的NSAutoreleasePool被耗盡時它被釋放。在那種情況下,我有一個後續問題:我如何影響這個並控制排水?

回答

2

它是自動釋放的,也就是當autorelease池被排空時它被釋放。通常在當前運行循環結束時。

在這種情況下,你不能真的改變它。你可以做的是retain它,以及release它以後當你知道它是安全的。這將阻止它通過自動釋放池流失被釋放。

您無法停止將這些對象自動轉到autorelease池,因爲該方法的內部實現會這樣做。您只能通過保留對象來確保autorelease不會將保留計數降至零。

+0

這就是我的想法。現在,我該如何改變這一點?我創建了大量的臨時值(因爲這段代碼經常被調用),我不希望我的程序使用所有的內存。 – Thorsten 2012-04-17 22:17:19

+0

您可以使用可變字符串'NSMutableString'來代替自我修改而不是創建字符串的轉換副本。在進行這種字符串轉換時,它的內存效率更高。 – 2012-04-17 22:19:11

+0

謝謝亞歷克斯,我想我必須重新執行我的實施。 – Thorsten 2012-04-17 22:20:11