1

메신저로 코코아가있는 Mac 용 비디오 레코더 응용 프로그램을 작성 중이며 메모리 사용에 큰 문제가 있습니다.Mac OSX 코코아 앱은 가비지 수집량이 많은 RAM을 가지고 있습니다.

앱을 실행하면보기를 변경할 수있는 버튼과 웹캠이로드되는 간단한 사용자 정의보기가있는 창이 있습니다. 이보기에는 21MB의 RAM이 필요합니다. 버튼 중 하나를 누르면 카메라에서 기록한 내용의 QTMovie로 사용자 정의보기가 변경됩니다.

내가보기를 바꿀 때마다 내 응용 프로그램이 upp를 약 10MB RAM으로 채우고 중지하지 않습니다. 가비지 컬렉션을 사용하고 있습니다. 비록 제가 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를 지켜 보면서 부하를 발생, 이것은 내가 그것을 표시 할 때마다 램 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없이 (누출이 없다고 가정하여) 실행 됨으로써 확인할 수 있습니까? 비디오의 크기에 따라 할당 크기가 합리적 일 수 있습니다. 인스트루먼트 (또는 유사한 도구)는 누가 이러한 호출을 생성 하는지를 알려줍니다. 디스크에서 비디오를 스트리밍하고 표시하는 데 필요한 총 30MB는 반드시 끔찍한 것은 아니며 조건에 따라 다릅니다. – justin

+0

가비지 컬렉션을 해제하고 수동 메모리 관리를하지 않으면 뷰를 변경할 때 응용 프로그램이 충돌합니다. 일부 수동 dealloc을 수행하면 가비지 수집과 동일한 문제가 발생하는 것 같습니다. – tobros91

답변

0

그래,보기를 바꾸기 위해 버튼을 누를 때마다 나는 SViewController* cameraViewController2 = [[NSViewController alloc] initWithNibName:@"kVideo" bundle:nil];과 같은 새로운 뷰를 할당했고, 결코 풀려나 버려지 지 않거나, 무엇을해야 할지를 결코 알지 못했다. 이제 대신 내보기를 한 곳에서 할당하고 새 단추를 누를 때 할당 된보기를 참조하십시오.

1

개체 그래프 및 가비지 수집기가있는 Instruments를 통해 앱을 실행합니다. 루트 오브젝트 참조가 배열과 같고 오브젝트를 할당하고이 참조에 추가하지만 절대로 제거하지 않는 것처럼 들릴지 모르겠다. 가비지 컬렉터가 무언가를 수집하는 방법을 알고있는 유일한 방법은 모든 루트 객체 (루트 객체를 통해 참조 된 모든 객체)가 더 이상 객체에 대한 참조를 가지고 있지 않다는 것입니다.

나는이 오브젝트에 대한 참조를 어떻게 든 가지고 있다고 생각하며 오브젝트 그래프를 사용하여 참조 방법을 알아야합니다.

+0

오래된 개체보기가 어떻게 든 할당 된보기를 변경할 때마다처럼 보입니다. 나는이 스 니펫이'([myCurrentViewController view]! = nil) [[myCurrentViewController view] removeFromSuperview];'이면 트릭을 수행 할 것이라고 생각했지만 뷰에서 제거되었지만 여전히 메모리에 남아 있습니다. 모든 루트 객체의 의미는 무엇입니까? 해당 주제에 대한 몇 가지 문서를 연결할 수 있습니까? – tobros91

+0

문서는 다음과 같습니다. http://goo.gl/JwFzC 기본적으로 계측기에서 힙 샷을 사용하고이 작업을 수행 할 때마다 할당되는 객체를 정확히 알고 있는지 확인한 다음 객체 그래프를 사용하여 이러한 개체는 여전히 루트 개체에서 참조되고 있습니다. 이러한 참조를 제거하면 가비지 수집기에서 해당 참조를 수집합니다. ? 그것은 단지 1.25gig 램을 가지고 있으며, 그래서 그것을 시도 할 수 있습니다 느린로 악기를 실행할 때 –

+0

나의 Mac으로는 :(이 뭔가 할 수있는 충돌'camRecorder (319,0xb032b000)의 malloc : *** 자동차의 malloc [319] : 오류 : GC 작업 암시 적으로 등록 된 스레드입니다. auto_zone_thread_registration_error()를 중단하여 디버그합니다. ' – tobros91