2011-08-30 157 views
5

經過長時間的配置文件測試後,我發現在我的一個「.m」文件中,內存泄漏發生在viewdidload部分。我檢查了一下,xcode突出顯示了我用值初始化了拾取器數組的部分。我的程序使用用戶輸入的採集器。我的程序中有3個不同的視圖。第一個是免責聲明,第二個是用戶可以選擇他/她想要執行的計算類型的菜單。每個計算都需要用戶從選取器輸入的某些輸入。例如。其中一個視圖具有5個輸入,由5個不同的輸入單元處理,單獨的數組用於保存這些值。這些數組使用該視圖的viewdidload方法中的值進行初始化。這是我運行測試後發現的:如何修復內存泄漏?

-viewDidLoad .................................. .................................................. ...............

instantiation

這是我第一次開發的應用程序,我有點困惑該怎麼做。任何幫助,將不勝感激。

+2

我的眼睛傷害=( –

回答

4

目標c中的對象具有保留計數。如果在對象超出範圍時(當您停止使用它時)該保留計數大於0,則會發生泄漏。

以下事情增加保留計數

  • [[ALLOC] INIT]
  • 拷貝
  • [保留]
  • 添加對象到一個數組
  • 添加作爲孩子的對象(如視圖)
  • 有可能更多,但你不出現使用任何其他人在你的代碼

下減少保留計數

  • [發行]
  • 從數組
  • 刪除對象,如果你的dealloc一個數組,其所有對象被釋放

你應該通過你的代碼,並確保每個數組的保留或添加都與一個對應的g版本。 (你可以在dealloc方法中釋放成員變量)。

編輯:傑里米做我的回答沒有

一旦你添加一個對象到一個數組一個有效的點,它取得所有權,當它與它做會釋放對象。你所要做的就是確保你根據內存管理規則釋放你自己擁有的任何內容。

還有一些autorelease對象,看看這個例子;

-(init){ 
    ... 
    stagePickerArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < 3; i++) 
    { 
     //this string is autoreleased, you don't have call release on it. 
     //methods with the format [CLASS CLASSwithsomething] tend to be autorelease 
     NSString *s = [NSString stringWithFormat:@"%d", i); 
     [stagePickerArray addObject:s]; 
    } 
    ... 
} 

我認爲你缺少的僅僅是一個電話在你的dealloc方法來釋放

-(void) dealloc 
{ 
    [stagepickerarray release]; //Do this for each of your arrays 
    [super dealloc]; 
} 
+1

對不起,但這是誤導。您不需要將一個添加項與一個發行版匹配。一旦將一個對象添加到數組中,它將獲得所有權並在完成對象後釋放該對象。所有你需要做的是確保你**根據內存管理規則釋放你擁有的任何東西**。 – JeremyP

+0

用您評論的引用編輯來澄清 –

+0

非常感謝你:)。我回去並確保所有保留的對象,如文本框,拾取器,工具欄等。我還爲每個陣列添加了一個版本,然後再次運行測試。這次沒有內存泄漏。但是我有一個問題,在測試期間,我還檢查了分配情況,總體字節數爲9.3mb,活動字節爲1.7 MB,這是否正常?還是應該擔心? – cyberbemon

0

在Objective-C中,您需要注意分配內存的保留計數。如果你不需要它 - >釋放它。

當你的alloc一個對象,它會返回一個保留計數對象= 1

通過使用保留,保留計數被遞增, 通過發行,保留計數被遞減。 每當保留計數等於0時,對象將被銷燬。

所以,只要你想在其他地方使用對象,你需要保留它。所以你要確保這個對象不會在另一個'person'(或者它使用的任何東西)之後被刪除,稱爲release。

這是一個非常非常簡短的描述。檢查以下指南 Memory Management Guide for iOS

(你也想讀一些關於ARC - 自動保留計數 - !這在iOS5的是新ios5 best practice release retain

+0

謝謝:)。我會看看那個! 。我目前正在使用iOS 4 xD – cyberbemon

2

泄漏工具只會告訴你在哪裏喲分配它認爲泄漏的對象,所以,它告訴。你,例如,該

NSString* answer = [NSString stringWithFormat: ... 

分配是永遠不會被釋放。現在,一個對象,-stringWithFormat:爲您提供了一個對象,you do not own,你似乎沒有任何地方保留。因此,你不需要將其釋放,所以不能自行泄漏。

這意味着其他東西,你自己必須保留它,你永遠不會釋放別的東西。主要嫌疑人似乎是stagePickerArray。檢查你是否在某處發佈stagePickerArray。如果它位於-viewDidLoad的本地,則必須在該方法結束之前釋放或自動釋放。如果它是一個實例變量,它必須在該類的-dealloc方法中發佈。

+0

謝謝:)我忘了爲陣列添加發行版!這是問題的原因! – cyberbemon