1

即時通訊編程爲mac與可可,並有一個巨大的內存使用問題的錄像機應用程序。Mac OSX可可應用程序需要大量RAM與垃圾回收

當啓動應用程序時,我有一個窗口有兩個按鈕,我可以更改視圖和一個簡單的自定義視圖,其中網絡攝像機加載。只是這個視圖需要21mb的RAM,當我按下其中一個按鈕時,我將自定義視圖更改爲從凸輪記錄的內容的QTMovie。

每當我改變看法我的應用程序用大約10mb的ram填充upp,並且永不停止。我有垃圾收集。即使我展示了QTMovie的視圖並且想要按下按鈕以再次顯示它,它也需要更多的內存。加載子視圖

代碼,從按鈕

if ([myCurrentViewController view] != nil) 
    [[myCurrentViewController view] removeFromSuperview]; 



     NSViewController* cameraViewController2 = [[NSViewController alloc] initWithNibName:@"kVideo" bundle:nil]; 
     if (cameraViewController2 != nil) 
     { 
      myCurrentViewController = cameraViewController2;  
     } 


[myTargetView addSubview: [myCurrentViewController view]]; 

觸發而這正是該videoView負載時會發生什麼,而這需要RAM的10MB我希望它顯示每次。

-(void)playMovie 
{ 

[movieView setMovie:nil]; 

NSString* moviePath = [NSBundle pathForResource:@"tempFile" ofType:@"mov" inDirectory:@"/Users/Shared/"]; 
QTMovie* movie = [[QTMovie alloc] initWithFile:moviePath error:nil]; 


[movieView setMovie:movie]; 

} 

- (void)awakeFromNib 
{  

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent3:) name:@"updateVideoPlayer" object:nil]; 

[self playMovie]; 
} 
+0

你可以通過運行沒有GC(也假設沒有泄漏),驗證它是否有垃圾收集的東西(或沒有)。取決於視頻的大小,分配大小可能是合理的。儀器(或類似工具)會指出誰在創建這些分配,哪些是在什麼呼叫中。從磁盤上傳輸和顯示視頻的總共30 MB並不一定很糟糕 - 這取決於條件。 – justin 2011-02-15 14:01:16

+0

如果我關閉垃圾回收,並且不做任何手動內存管理,當我更改視圖時,應用程序崩潰,如果我執行一些手動dealloc,我似乎得到與剛發現的垃圾回收相同的問題。 – tobros91 2011-02-15 14:13:00

回答

0

好吧,我解決了它,每當我按下按鈕來改變視圖,我分配了這樣的新視圖,像這樣的SViewController* cameraViewController2 = [[NSViewController alloc] initWithNibName:@"kVideo" bundle:nil];,他們永遠不會被釋放或扔掉或他們應該做的。現在,我分配我的意見在一個地方,只是指我分配的意見,當我按新的按鈕。

1

我會運行你的應用程序通過儀器與對象圖和垃圾收集工具上。從你描述它聽起來像你有一個根對象引用類似於數組,並且您正在分配對象並將其添加到此引用,但從不刪除它們。垃圾收集器知道如何收集東西的唯一方法是如果所有的根對象(以及通過根對象引用的任何對象)不再有對象的引用。

我敢打賭,你仍然有這些對象的引用莫名其妙,你只需要使用對象圖來看看你仍然有一個對它的引用。