Mac OSX可可应用程序需要大量的垃圾收集

时间:2011-02-15 10:40:53

标签: objective-c cocoa macos memory-management garbage-collection

我正在用cocoa编写一个mac录像机应用程序,并且内存使用存在很大问题。

启动应用程序时,我有一个窗口,其中包含两个可以更改视图的按钮,以及一个加载网络摄像头的简单自定义视图。只需这个视图需要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]];

当视频加载时会发生这种情况,每次我希望它显示时,这需要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];
}

2 个答案:

答案 0 :(得分:1)

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

我敢打赌你仍然以某种方式引用这些对象,你只需要使用对象图来看看你是如何引用它的。

答案 1 :(得分:0)

好的,我解决了这个问题,每次按下按钮更改视图时,我都会使用类似SViewController* cameraViewController2 = [[NSViewController alloc] initWithNibName:@"kVideo" bundle:nil];的内容分配新视图,并且它们永远不会被释放或丢弃或者应该做什么。现在我将视图分配到一个地方,当我按下新按钮时,只需参考分配的视图。