2009-09-27 62 views
1

我正在開發一個應用程序,它有近12個視圖控制器。應用程序具有帶4個選項卡的tabBar意味着四個視圖控制器,並且有多個視圖可在每個選項卡欄中導航。請注意每個選項卡都有一個帶有rootviewController作爲其第一個視圖的navigationController。應用程序是廣泛的數據庫應用當我在模擬器上運行時,它運行的很好,但是在設備上運行時得到了didRecieve內存警告。關於同樣的問題,我也有幾個問題。在iPhone上需要幫助didRecieveMemoryWarning

注意:我已使用儀器工具檢查了泄漏應用程序,並且沒有紅色金字塔,這意味着代碼中沒有泄漏。

  1. 當處理多個視圖控制器時,最佳做法是什麼?

  2. 當我收到內存警告時,我調用[self deleteObjects],它會刪除所有正在修改當前控制器值的實例。但如果這是正確的方法,我不確定。當我們收到記憶警告時應該做些什麼。有沒有什麼好的教程。 (鏈接plz)

  3. 此外如何確保[self deleteObjcts]沒有爲可見控制器調用。 (我之前調用了viewDidUnload方法中的deleteObjects方法,但是由於我們做了[super didRecieveMemoryWarning],因爲viewDidLoad在層次結構中從上到下被調用,所以一旦我刪除了頂層viewController的對象,顯然其餘部分。控制器)

一些對我來說基本棘手的問題如下:

  1. 爲什麼內存警告並不一致。就像我在開始的時候有時會得到它們,而有時候沒有警告。當我們使用[NSDate date],[UIImage imageNamed:@「...」],[NSString stringWithFormat]等,我們不擁有這些對象,我們不必釋放它們,但我們如何確保這些對象當我們收到一條內存警告時,對象會被關閉。

  2. 我在多個地方使用NSMutableArray。在這個數組中,我存儲了[NSString StringWithFormat],[UIImage imageNamed ...]對象,所以當我釋放數組時,我需要放棄數組中的對象,但我不擁有它們。

雖然這是問題的一個大名單,但我感謝您的幫助和時間,因爲我在我的開發最後階段,我面對這些重大挑戰。

+0

只是因爲儀器沒有看到內存泄漏並不意味着它們不存在。您可能想要讓您的代碼通過Clang Static Analyzer來查看它是否找到任何東西。 – 2009-09-28 00:28:04

回答

1
  1. 當內存不足時會收到內存警告。內存不僅被你的應用程序佔用,所有其他正在運行的進程都使用內存,所使用的內存可能會不一樣。
  2. 這些對象都是自動釋放的。 NSAutoreleasePool將負責釋放對象,你不應該自己釋放這樣的對象(當然,只要你自己沒有保留它)。這並不重要,autoreleased對象將很快發佈。
  3. 將對象放入數組時,它將被保留。當你釋放數組時,它會發送所有它的子對象。當你將自動釋​​放的對象存儲在數組中時,他們會照顧自己的釋放。這在釋放數組時可能已經發生,因此將立即在所有對象上調用-dealloc

    NSMutableArray *someArray = [[NSMutableArray alloc] init]; 
    NSDate *date = [NSDate date]; // Autoreleased object. Retain-count is 1 
    [someArray addObject:data]; // The array retains the data object. Now has a retain-count of 2 
    // Some other things 
    // The date object has been called release at some time (because it was autoreleased) 
    // so date now has a retain-count of 1 
    [someArray release] // Will release all containing objects thus date will be called dealloc 
    
+0

關於autorelease池,如果你有一個創建許多自動釋放對象的大(我的意思是巨大的)循環,你可能會考慮創建你自己的NSAutoreleasePool,因爲這些對象只會在Application Kit創建的事件循環結束後纔會釋放。這可能有幫助(幫助了我很多):http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html – leolobato 2009-09-27 21:40:25

1

與UIImage的imageNamed,我認爲是由OS緩存圖像產生的,當它不應該將他們釋放我碰到內存問題。還有很多其他開發者看到了同樣的事情。

我會嘗試使用imageWithContentsOfFile而不是imageNamed,看看會發生什麼。

例如forPNG圖片 -

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"filename here" ofType:@"png"]]; 

這裏有一個thread that covers what I'm talking about