2012-01-09 138 views
0

我只是在調查一些內存泄漏,我使用的是Xcode 4.0.2。我已經在Xcode中運行了分析工具,並且已經確定了很少的內存泄漏。我對Objective-C比較陌生,這是我的第一個應用程序。我在這裏粘貼代碼:Objective-C內存泄漏

http://pastie.org/3155043

我添加註釋上面的代碼,其中的內存泄漏存在的。

內存泄漏一:方法返回帶有+1保留計數(擁有引用)的Objective-C對象。

內存泄漏二:在第248行分配並存儲在'imagesNames'中的對象未在此執行路徑中引用,並且保留計數爲+1(對象泄露)。

內存泄漏三:在線246上分配並存儲到'cmpWordoutStr'中的對象的潛在泄漏。

任何幫助表示讚賞。

問候, 斯蒂芬

回答

0

當湯姆安德森以上建議我用自動釋放,這解決了這個問題,下面的例子:

NSString *cmpWorkoutStr = [[[NSString alloc] init] autorelease]; 
NSString *imageNames = [[[NSString alloc] init] autorelease]; 

問候, 斯蒂芬

1

你可能要考慮使用自動引用在您的項目計數。 我問一個問題有一天就到這裏,因爲我不知道,這是個好主意,但答案使我確信,它確實是一個進步,是非常值得趁着:

To ARC or not to ARC? What are the pros and cons?

希望這有助於:)

+0

如果你不爲iOS開發,忽略了這個答案..我最後的咖啡一定已經磨損了。 – 2012-01-09 16:48:06

1

泄漏1)你不顯示返回或確定哪個變量返回,所以不可能明確診斷這一個。

泄漏2)您分配/ init一個NSString並將其分配給一個永遠不會釋放的變量。這是錯誤的,原因有兩個:

  1. 對於每個alloc,必須有相應的版本。
  2. 對空字符串進行alloc/init沒有意義。如果你想要一個空字符串,只需使用@""

泄漏3)基本上與(2)相同。

(你真的需要得到的Objective-C編程的一本好書,學習和再論存儲管理的部分。否則,你就可以在黑暗中跌跌撞撞左右)

1

你分配一個對象第一

NSString *cmpWorkoutStr = [[NSString alloc] init]; 

,並重新分配指針而不釋放所述存儲器:

cmpWorkoutStr = [cmpWorkoutStr stringByAppendingString:indWorkoutStr]; 

因此泄漏。

我沒有深入分析你的代碼,但我想你實際上需要NSMutableString那裏。

+0

可變字符串通常是一個壞主意,除非性能受到影響。 NSString * cmpWorkoutStr = @「」或NSString * cmpWorkoutStr = [[[NSString alloc] init] autorelease];基本上是相同的,你需要其中的一個。 – 2012-01-09 20:51:44