2013-07-24 165 views
0

好了,所以這是一個非常模糊的問題,但讓我告訴你一些背景:如何限制iOS應用程序的內存使用情況

我有一個簡單的應用程序,到目前爲止 - 大約5個屏幕每個將訪問數據庫和在結果視圖上顯示一些信息。這些對象不是巨大的,大約有15個屬性,其中一些屬於包含3-4個對象的NSSets。

我注意到,當我在第5個屏幕上時,內存已經跳到將近6mb,這對我來說似乎很大(儘管我可能是錯的)。

我注意到每次我做一個像NSFetchRequest一樣的數據庫調用時,它會使用通常的NSManagedObjectContext,NSPersistentStoreCoordinator等,就像你期望的那樣。

當我完成數據庫或類似的事情時,是否需要關閉上下文?我記得這樣的持久性上下文在我的Java時代中造成了巨大的內存問題,並且因爲沒有其他任何事情(我相信)可以真正對應用程序徵稅,我猜測問題是。

我正在使用ARC和CoreData。

任何洞察到這將非常感激。

更新

所以我用儀器作爲推薦(偉大的工具,順便說一句),它看起來好像問題是由一個屏幕約30-40 UILabels(導致大約4MB使用)造成的。似乎有很多UILabels的內存,或者我完全沒有?

+1

不太可能是上下文問題。您是否使用Instriments來找出使用所有內存的對象類型?您是否爲視圖背景加載任何圖像? – Wain

+1

您是否試過在樂器中按名稱跟蹤對象? – Aaron

+1

嘗試在樂器下運行您的應用程序,並在其中使用分配工具。查看每次獲取調用時內存圖的變化情況。在每次獲取Core Data之前和之後堆積快照也很有用。這樣你可以看到在這種情況下保留了哪些對象。 – Macondo2Seattle

回答

1

每個UIView有一個CALayer。所以每個視圖都會緩存它的內容。假設你的30-40標籤結束了填充屏幕,並且你在iPhone 4上,那麼你會期望它們的內存佔用至少爲960 * 640 * 4 = 2.4mb。我敢打賭,他們佔據的空間比這更大。

如果你從它的痛苦,忽略你的直覺想到,作爲一個巨大的浪費,這是因爲:

  • 的iOS 5下和更早版本,如果內存不足的警告出現那麼任何關屏視圖控制器將發表他們的觀點;和
  • 在iOS 6下(並且推測是前進的),如果發生內存警告,則連接到所有離屏視圖的圖層將釋放其內容。

因此,通常情況下,內存僅在可用時使用 - 這是一個簡單的問題,因爲它可能並不總是可用。

+0

有趣,謝謝。當你說「只是因爲它可能並不總是可用而忽略資源是一件簡單的事情」時,不確定你的意思。這是另一種說法:「只使用可用的資源」? – Ger

相關問題