2010-07-29 44 views
2

我正在潛入iOS開發領域並逐漸熟悉這些工具。在每天結束時,我會在我的應用程序中執行「使用樂器工具運行 - >泄漏」來檢查當天可能實施的任何內存泄漏。它很少似乎檢測到任何泄漏,雖然我想我只是一個自然的iOS程序員,我拒絕相信;)爲什麼儀器「泄漏」模板在我的iOS應用程序中發現我的內存泄漏?

無論如何,我只是發現我認爲是我的內存泄漏代碼,它不會被儀器捕獲。我有這行代碼...

gkSession = [[GKSession alloc] initWithSessionID:@"testID" displayName:@"Temp Display Name" sessionMode:GKSessionModeClient]; 

,我發現,我並沒有在我的代碼調用release任何地方。我的問題是...

  1. 這是內存泄漏嗎?
  2. 如果是這樣,儀器可能無法捕捉它的原因是什麼?

我明顯的擔心是我的代碼中有內存泄漏,而Instruments沒有捕獲它們。

非常感謝您的幫助!

+0

什麼是gkSession(財產?ivar?)在你的應用程序中gkSession「超出範圍」的地方有一點嗎?當我開始時,我發現靜態分析儀是超級有用的。 http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html – Steve 2010-07-29 18:25:08

+0

謝謝,史蒂夫,我會檢查出靜態分析器。是的,這是一個視圖控制器的ivar,被推到導航堆棧上。 – BeachRunnerFred 2010-07-29 18:27:02

+0

啊!然後我可以提出一個答案! :) – Steve 2010-07-29 18:28:52

回答

6

有多種類型的動態分配內存。

  1. 存儲器的引用計數大於零,它仍然被引用並正在使用中。

  2. 存儲器的引用計數爲 爲零,它仍被引用並仍在使用中。

  3. 引用計數大於零的引用未被引用的內存。

  4. 存儲器引用計數爲零,未引用。

  5. 內存引用計數爲 大於零,它仍然被引用並且未被使用。

第一類是正常使用的內存。第二種類型是一個錯誤,當您嘗試關注該參考資料時,該錯誤將被報告爲非法訪問。類型3是儀器檢測到的泄漏類型。內存系統應該釋放類型4。

類型5是儀器無法檢測到的泄漏,也不會被完整的垃圾回收器處理。這是你似乎擁有的。

編輯:

我忘型6 - 內存使用引用計數不符合實際的引用數。這可能最終會變成類型2或4.

+0

謝謝,達朗!你有沒有找到第5類泄漏的方法? – BeachRunnerFred 2010-07-29 18:47:09

+0

在Java世界中有很多工具可以幫助您找到這些工具,但我不熟悉iOS中的任何工具。這並不意味着他們不存在,我不熟悉那裏的工具。 – Darron 2010-07-29 18:49:16

2

#1的答案是「可能」...如果您的視圖控制器從堆棧中彈出,並且沒有其他人保留它,那麼您的視圖控制器應該得到釋放。但是(這可能是你問題#2的答案)我最初犯的一個錯誤並不瞭解當你調用pushViewController時:導航控制器將保留你的視圖控制器,所以你不必這樣做。確保在創建視圖控制器並將其推入堆棧後釋放視圖控制器。

​​

我相信靜態分析器會警告你,如果你忘了在這種情況下釋放呼叫......這是一個原因靜態分析是如此之大。

如果你不是在這一點上釋放視圖控制器,你的保留計數將總是比它應該高+1。

我注意到靜態分析儀對於這些東西比儀器的泄漏工具更有用。 (例如,其中不會找到包含循環引用的「泄漏」......引用自身的兩個泄漏對象不會顯示,因爲「引用」仍在您的對象周圍)。

所以目前你的線沿線的東西...

@interface MyClass : UIViewController 
{ 
    GKSession * gkSession; 
} 

... 

@end
在您的實現

你應該確保你釋放你的伊娃在你的dealloc方法:

@implementation MyClass 

... 

- (void)dealloc 
{ 
    [super dealloc]; 

    if (gkSession) [gkSession release]; 
} 
@end 
+0

謝謝,史蒂夫,我似乎遵循上面指定的所有約定,所以我不知道還有什麼要嘗試。 – BeachRunnerFred 2010-07-29 18:53:08

+0

是否在您將視圖從堆棧彈出時爲您的視圖控制器調用dealloc? – Steve 2010-07-29 18:56:00

+0

是的,它的確如此。真奇怪。 – BeachRunnerFred 2010-07-29 19:00:22