2011-09-30 283 views
7

我正在創建一個具有多個動畫功能的應用程序。 有50頁,每頁有不同的動畫,每個動畫使用許多圖像。如何解決內存崩潰問題

我使用UIPresentModelViewController來呈現視圖,而 正在使用NSTimer更改圖片。

當我連續刷卡與此消息的應用程序崩潰: -

Program received signal: 「0」. 
Data Formatters temporarily unavailable, will re-try after a 'continue'. 

(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib") 

我搜索了很多,但找不到這個問題的任何適當的解決辦法。

+1

您是否嘗試過運行「Analyzer」以查看是否發現任何潛在的泄漏? – 5StringRyan

+0

@HansGruber:是的,我們嘗試運行內存泄漏,但我們沒有發現任何泄漏。任何其他的解決方案請同樣..謝謝.. –

+0

分析儀和泄漏是不同的工具。有一個靜態鐺分析器,您可以使用它來不僅找到內存泄漏,而且還可以找到代碼中的其他問題點。定期運行它是個好主意。請注意,靜態鐺分析器不能在儀器下運行,也不是分析工具。您可以在產品菜單下找到它。 「產品>分析」。另一方面,泄漏是用於監視對象的分析工具,以查看在刪除對象的所有引用之後它們是否未被釋放。 – Sam

回答

0

你的代碼,你是每次增加新的觀點做一些錯誤,但忘了釋放它在短短檢查...

+0

感謝您的回答,但是我們在XIB中使用了IBOutlet並相應地更改了其中的圖像....請向我們提供更多的信息.​​.謝謝.. –

+0

您可以添加一些代碼,因此很容易檢測到錯誤。 –

0

這聽起來像是一個堆棧溢出給我。在項目的C/C++語言設置的「其他C標誌」部分添加「-fstack-check」標誌並查看是否會產生任何不需要的遞歸。

0

信號0通常是由於應用程序使用太多內存而導致內存不足。檢查是否調用了內存警告方法。

的數據格式化啄加載失敗可能是由於沒有足夠的內存來加載它..喜歡你

+0

這個答案是正確的,如果你得到一個0的信號,那麼你用完了所有可用的應用程序內存。您需要返回並重寫代碼,以便它不會同時在內存中保存所有解壓縮的圖像。這是你最可能導致內存不足的原因,因爲解壓縮的圖像很大! – MoDJ

0

50次形容就像一個大的內存豬的聲音。所以我懷疑內存管理正在卸載一些視圖。然後當你的程序需要這些視圖時,它們不在那裏,你的程序崩潰。錯誤消息不太適合這一點,但它可能不會準確地告訴你問題是什麼。

請考慮以下可能的情況,並確定它是否適合您對此程序進行編碼的方式。

爲了讓操作系統管理內存,它可以卸載視圖並根據需要重新加載視圖。完成此操作後,將調用方法viewDidUnload,loadView和viewDidLoad。

viewDidUnload:

這種方法被稱爲爲對應於viewDidLoad方法。在視圖控制器需要釋放其視圖以及與該視圖關聯的任何對象以釋放內存時,在低內存條件下調用它。由於視圖控制器經常存儲對視圖和其他視圖相關對象的引用,因此應該使用此方法放棄這些對象的所有權,以便可以回收它們的內存。您應該只爲您稍後可以輕鬆重新創建的對象執行此操作,無論是在viewDidLoad方法中還是從應用程序的其他部分重新創建。您不應該使用此方法來釋放用戶數據或任何其他無法輕易重新創建的信息。

的loadView:

視圖控制器調用當請求視圖屬性,但目前零此方法。如果您手動創建視圖,則必須重寫此方法並使用它來創建視圖。如果使用Interface Builder創建視圖並初始化視圖控制器 - 也就是說,您使用initWithNibName:bundle:方法初始化視圖,直接設置nibName和nibBundle屬性,或者在Interface Builder中創建視圖和視圖控制器 - 那麼你不能重寫這個方法。

檢查UIView類參考 -

viewDidLoad中:

視圖控制器加載其相關聯的視圖到內存中後,此方法被調用。無論視圖是存儲在nib文件中還是以編程方式在loadView方法中創建,都會調用此方法。此方法最常用於對從nib文件加載的視圖執行附加初始化步驟。

您可能無意中在init方法中初始化了這些視圖,而不是在loadView方法中初始化這些視圖。如果你這樣做了,那麼當操作系統卸載視圖(你會看到viewDidUnload被調用)時,與視圖和所有子視圖(所有圖像和動畫)相關的內存將被卸載。這樣可以節省內存,但是當您需要重新顯示這些卸載視圖之一時,如果之前卸載視圖,則會先調用loadView。如果你的視圖設置是在init方法而不是loadView中完成的,那麼這個視圖將不會再被設置。但是,如果視圖設置是在loadView方法中完成的,則可以在內存管理卸載它之後恢復它。

+0

viewDidUnload在iOS 6.0中已棄用。視圖不再在低內存條件下清除,因此此方法從不被調用。 – Bastian

0

有一個簡單的方法可以找到難以通過泄漏儀器等發現的泄漏 - 殭屍分析器。它顯示程序中的每個未鏈接的內存,並且您可以在幾分鐘內輕鬆檢測泄漏並優化代碼。

0

如果您在單個動畫中使用大量圖片,那麼您做錯了。你應該有一個或幾個非常大的圖像,然後只顯示該圖像的一部分。通過這種方式,您可以加載很少的圖像,但是具有許多圖像的相同效果。

研究cocos2d或其他製作遊戲的流行框架,因爲它們對UIKit的動畫效率會更高。

0

使用儀器工具找出內存崩潰的原因,然後使用建議的設計模式通過最佳實踐重構代碼。對此沒有獨特的解決方案。謝謝。