2012-02-22 50 views
3

我正在研究一個iPad(僅)應用程序,我偶然發現了一個奇怪的問題。該應用程序在iPad 1上發生內存警告後終止,但在iPad 2上正常工作。 我使用ARC並以iOS 5爲目標。我使用筆尖並使用UIImageViews顯示大多數資產。我還有幾百個按鈕和大量的手勢識別器......我重新觀看了ARC上的WWDC11視頻(會話323和322),我似乎沒有做任何特別的事情。ARC:內存不會被回收?

的應用程序是UIImage的密集,我做的很多使用UIImage的動畫。但是,我使用initWithContentsOfFile構造函數而不是imageNamed調用。我試圖阻止圖像被系統緩存。

我還使用GCD安排音效和動畫的看法。我總是在主線上做這件事。

應用程序使用的是從未有它的堆棧超過1個UIViewController的一個UINavigationController。我可以證實這是真的,因爲didReceiveMemoryWarning只在當前視圖控制器上被調用(我正在記錄該調用)。

我不明白的是爲什麼儀器在分配和VM跟蹤儀器二者的報告高數字(彷彿視圖控制器沒有得到解除了分配)。當我從一個視圖控制器導航到另一個視圖控制器時(這是我所期望的),Allocations儀器會顯示一個小滴,但VM跟蹤器樂器顯示當我執行同樣的操作時,髒大小沒有下降。最終,應用程序使用太多內存並終止(在iPad 1上)。當我在iPad 2上收到內存警告時,該應用程序不會終止,但...

感覺好像我的圖像,聲音或視圖不會被破壞,內存不會被回收...我的對象層次結構非常基本,不應該有任何形式的保留週期。我甚至沒有簡單的代表...

你有什麼建議嗎?我真的不想只爲iPad 2或更新版本發佈這個應用程序...這是一個適用於孩子的應用程序,這將是一個可憐的...我會很高興得知我做錯了什麼,因爲我真的想確保這個程序是它可以是最好的......

乾杯, 尼克

+0

只是一個快速評論:我花了很多時間使用儀器搜索泄漏,但它看起來並不像有。另外,如果有的話,我會認爲iPad 2會崩潰並最終燒壞,但它不會...... – nicktmro 2012-02-22 06:25:43

回答

1

我不像回答我自己的問題,但我認爲這可能對未來的谷歌搜索引擎有所幫助。我實現了我自己的基於UIImage的動畫,並且不再使用animationImages屬性。結果我的記憶問題現在消失了,因爲我不再需要將所有圖像存儲在內存中,而是使用計時器來加載它們。

我實際上認爲推出自定義動畫是有益的,因爲它允許回調和更強大的自定義選項。

一旦我對它感到滿意,我覺得它已經準備好共享,我會在GitHub上發佈這個類。

+0

你可以發佈你的代碼嗎? – chrisallick 2014-10-21 15:28:19

1

有辦法說,通過設置其屬性「優化」你的對象nil某些時候事情並不需要 - 所以當你不能寫一個dealloc方法了,你可以做self.object = nil(相關時),它結束了做這樣的事情在非ARC世界的「保留」(即strong)物業編號:

- (void)setObject:(id)newObject 
{ 
    [object release]; // send release message to current object 
    object = newObject; // set reference to newObject 
    [object retain]; // send retain message to newObject 
} 

現在,在ARC中,您不能/不能在您的代碼中自己編寫保留/釋放,編譯器會爲您插入這些調用,這意味着在實踐中,將屬性設置爲nil將在上面執行此操作例如:

[object release]; // send release message to current object 
object = nil; // set reference to nil 
[object retain]; // send retain message to nil (no effect) 

而且,這是冰山的一角 - 你應該確保有在你的代碼,這可能是導致無追索權的銷燬泄漏對象是no retain cycles。這意味着,當您應該使用weak屬性時,可能會有某些地方使用strong引用屬性(即對象)。不同之處,即強引用retain ED和weak引用assign版,前者有其retainCount增加,後者導致屬性賦值,看起來像這樣如果手寫:

- (void)setObject:(id)newObject 
{ 
    object = newObject; 
} 
+2

您可以編寫'dealloc'方法 - 您只需對任何東西不能調用'release',也不能調用' [super dealloc]'。但清理的「dealloc」方法仍然是猶太教。 – Steve 2012-02-22 06:28:47

+0

感謝Alan,我將viewDidDisappear和viewDidUnload都設置爲零。 dealloc確實被調用,但對實際內存佔用量沒有影響。鑑於該項目的平面結構應該沒有保留週期,但我會再次檢查一次... – nicktmro 2012-02-22 06:28:49

+0

@Steve我實際上寫了自己的dealloc只是爲了看看它什麼時候被調用。它確實被調用時,預期... – nicktmro 2012-02-22 06:29:32