2014-09-01 63 views
0

我正在編寫自定義動畫,並且我懷疑存在內存泄漏,但我不確定。每次我運行一個給定的動畫時,內存都會增加一點,但不會下降。爲了確保,我做了一個試驗:不知道它是否是內存泄漏(ARC)

NSLog(@"%@", self.weakanim); 

// The animation collection to run 
HyAnimationCollection * collection = [[HyAnimationCollection alloc] init]; 

self.weakanim = collection; 

第一本記錄nil那麼它會隨時記錄的地址。所以這裏有兩個指標:

  1. 內存從9.7MB開始,每10次運行一次就上升0.1MB。我測試了這個大約12MB。現在,每次釋放內存還是僅僅是ARC(比如說JVM的垃圾收集器)只能週期性釋放內存?也就是說,也許這不是泄漏,而是ARC尚未發佈它,因爲我沒有達到一定數量。
  2. 我宣稱weakanimweak只是爲了看看之前的動畫集合是否被釋放,但同樣的問題仍然出現:ARC是不是釋放而是
+1

看起來像是從您的描述泄漏。使用工具來了解什麼沒有被髮布。 http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/ – 2014-09-01 15:15:29

+0

什麼一個很棒的工具!它已經固定在我的碼頭上了。仍在研究它。謝謝! – 2014-09-01 15:40:46

回答

2
  1. ARC不能像JVM那樣工作。最接近的是它使用「自動釋放池」。在這種情況下,直到運行循環結束時,對象纔會關聯。如果您看到動畫正在運行,那麼運行循環很可能正在運行,並且池應該定期刷新。

  2. 顯示是否有泄漏的更好方法是在HyAnimationCollection類的dealloc方法中放置一個斷點。如果你的其他調查是正確的,我的猜測是它從來沒有被調用過。您可能在代碼中有一個保留週期。

+0

但是如果池定期刷新,我怎麼能確定dealloc方法已經被調用?另外,我應該重寫'dealloc'嗎?我無法調用'[super dealloc]',因爲ARC禁止它。 – 2014-09-01 15:39:54

+1

它不像垃圾收集器「週期性」工作那樣「週期性」。基本上,如果你的應用程序響應 - 動畫運行,屏幕上的水龍頭正在響應 - 運行循環正在工作,自動釋放池正在被耗盡。是的,使用ARC時,您只需重寫'dealloc'。 – 2014-09-01 15:43:15

+0

我明白了。那就是泄漏。 – 2014-09-01 16:31:57