Mac OSX приложение какао занимает огромное количество оперативной памяти с сборкой мусора - PullRequest
1 голос
/ 15 февраля 2011

Я пишу приложение для записи видео для Mac с какао, и у меня огромные проблемы с использованием памяти.

При запуске приложения у меня есть окно с двумя кнопками, с помощью которых я могу изменить вид, и простойпользовательский вид загрузки веб-камеры.Только это представление занимает 21 Мб оперативной памяти, когда я нажимаю на одну из кнопок, я изменяю пользовательский вид на QTMovie контента, записанного с камеры.

Каждый раз, когда я меняю вид, мое приложение заполняет около 10 Мббарана, и никогда не останавливается.У меня есть сборка мусора.Даже если я показываю вид 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 загружается, и это занимает 10 МБ ОЗУ каждый раз, когда я хочу, чтобы он отображался.

-(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 ]

1 голос
/ 15 февраля 2011

Я бы запустил ваше приложение через инструменты с включенным графом объектов и инструментами сбора мусора. Из того, что вы описываете, звучит так, будто у вас есть ссылка на корневой объект на что-то вроде массива, и вы выделяете объекты и добавляете их к этой ссылке, но никогда не удаляете их. Единственный способ, которым сборщик мусора знает, как что-то собирать, - это если все корневые объекты (и любые объекты, на которые ссылаются корневые объекты) больше не имеют ссылку на объект.

Держу пари, что у вас все еще есть ссылки на эти объекты, и вам просто нужно использовать граф объектов, чтобы увидеть, как у вас все еще есть ссылка на него.

0 голосов
/ 17 февраля 2011

Хорошо, я решил это, каждый раз, когда я нажимал кнопку, чтобы изменить вид, я назначал новый вид чем-то вроде этого SViewController* cameraViewController2 = [[NSViewController alloc] initWithNibName:@"kVideo" bundle:nil];, и они никогда не выпускались, не выбрасывались и не делали то, что должны были делать.Теперь вместо этого я размещаю свои виды в одном месте и просто обращаюсь к выделенным видам, когда нажимаю новые кнопки.

...