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

我会运行你的应用程序通过仪器与对象图和垃圾收集工具上。从你描述它听起来像你有一个根对象引用类似于数组,并且您正在分配对象并将其添加到此引用,但从不删除它们。垃圾收集器知道如何收集东西的唯一方法是如果所有的根对象(以及通过根对象引用的任何对象)不再有对象的引用。

我敢打赌,你仍然有这些对象的引用莫名其妙,你只需要使用对象图来看看你仍然有一个对它的引用。