2011-12-05 53 views
0

我正在學習Objective-C的過程,並創建我的第一個iPhone應用程序,但是我似乎遇到了釋放分配的視圖內存的問題。我認爲有很多代碼要包含在問題本身中,所以我創建了一個小的示例應用程序並將代碼上傳到github(這裏:https://github.com/MatthewStacey/PauseTest)。iPhone - 釋放資源的問題(xib/view/viewcontroller)

在示例應用程序中,我有三個視圖,一個主頁面,一個遊戲頁面和一個暫停視圖。

在主頁面上有一個按鈕,它會帶你到遊戲頁面(帶淡入/淡出動畫)。

在遊戲頁面上有一個按鈕,它將顯示暫停視圖(UIView)。

在暫停視圖中,有兩個按鈕,一個隱藏視圖並保留遊戲頁面顯示,另一個顯示主菜單。

功能性明智的示例應用程序做它應該做的事(即沒有泄漏,並顯示適當的視圖),但是當我看着儀器活動監視器中的應用程序正在使用的內存不斷增加/隱藏三種不同的觀點。

我花了兩週的最佳時間閱讀,並試圖找出我沒有正確釋放的東西無濟於事。有人可以看看我上傳到github的項目,告訴我哪裏出錯了,我該如何克服這個問題?

如果需要,我很樂意提供更多信息/說明。請注意我已經定位iOS4。

回答

1

您正在泄漏PauseViews。

在你的GAME.m文件的pausePressed方法中,你創建了一個PauseView類的新實例。當你將它作爲子視圖添加到某個東西時,它會被超級視圖保留。在pausePressed方法返回後,您不再有對PauseView的引用,因此無法釋放它。在相關說明中,在您的PauseView類的dealloc方法中,您有「[self removeFromSuperview]」。這是沒有道理的,因爲如果它在那個時候有一個superview,它會有至少一個retainCount,但是dealloc永遠不會被首先調用。在PauseView的dealloc方法中放置一個斷點,你會發現它永遠不會被調用。

我用這個方法找到它: http://useyourloaf.com/blog/2011/3/8/using-heapshots-to-find-abandoned-memory.html

您PauseView創建一個實例變量,並嘗試此爲您pausePressed方法:

- (IBAction) pausePressed 
{ 
    CGRect startFrame = CGRectMake(0, -500, 320, 480); 
    if (!pv) { 
     pv = [[PauseView alloc] initWithFrame: startFrame :10 :3]; 
     [pv setDelegate: self]; 
     [self.view addSubview:pv]; 
    } 
    pv.frame = startFrame; 
    [pv showPauseView]; 
} 

而且不要忘記釋放伊娃在dealloc的。

+0

嗨bdmontz,感謝您的回覆和鏈接,它對我非常有用。我明白現在引入棄用內存的地方,但我並未100%清楚如何解決這個問題,你是否建議我在GAME.h中爲PauseView創建一個屬性,然後嘗試在pauseMenuResult方法中釋放它?我需要保留PauseView還是隻使用assign?如果你可以根據你的建議更新你的答案,那麼我將測試並標記爲假設它可行的答案。再次感謝你的幫助。 – MattStacey

+0

我也建議不要在方法中使用未命名的參數。你可以改變: ' - (id)initWithFrame:(CGRect)frame:(int)totalQuestions:(int)questionNumber' to: ' - (id)initWithFrame:(CGRect)frame totalQuestions:(int)totalQuestions questionNumber:(int)questionNumber' – bdmontz

+0

嗨bdmontz,感謝您的更新和對initWithFrame方法的建議,我不知道你可以做到這一點。回答這個問題,我已經提出了上述建議,但現在當我點擊主視圖上的遊戲按鈕時,該應用程序現在崩潰,並說'程序接收信號:「EXC_BAD_ACCESS」' - 感謝在這裏堅持與我一起?如果你能幫忙看看,我已經把我的第二次嘗試上傳到github上面的位置了?隨意更改代碼,如果它更容易 - 再次感謝! – MattStacey