2011-03-01 4 views
1

여러 개의 동영상이 무작위로 표시되고 모든 것이 훌륭하고 훌륭하게 작동하는 앱이 있습니다. 그들은 동일한 코드를 반복해서 반복하기 때문에 루프가 갑자기 멈추는 것은 매우 이상합니다. 아래의 오류 메시지는 무엇에 관한 것입니까?실행 시간 후 가비지 수집으로 EXC_BAD_ACCESS로 인해 충돌이 발생합니다.

그러나 몇 시간 후에 충돌이 발생합니다. 처음 충돌이 발생하기 전에 13 시간 동안 뛰었고 오늘 밤 11 시간 만에 추락했습니다.

Process:   CamRecorder [4695] 
Path:   /Users/wgv/Desktop/Fullscreeen/CamRecorder.app/Contents/MacOS/CamRecorder 
Identifier:  wgv.CamRecorder 
Version:   1.0 (1) 
Code Type:  X86 (Native) 
Parent Process: launchd [86] 

Date/Time:  2011-03-01 02:21:03.509 +0100 
OS Version:  Mac OS X 10.6.6 (10J567) 
Report Version: 6 

Interval Since Last Report:   428620 sec 
Crashes Since Last Report:   2 
Per-App Interval Since Last Report: 257957 sec 
Per-App Crashes Since Last Report: 2 
Anonymous UUID:      4528D13C-54C9-413F-92D9-128D05272F57 


Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000fef6e1df 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Application Specific Information: 
objc_msgSend() selector name: rectSetBeingDrawnForView: 
objc[4695]: garbage collection is ON 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib      0x93719ed7 objc_msgSend + 23 
1 com.apple.AppKit     0x915ae95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
2 com.apple.AppKit     0x915ae95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
3 com.apple.AppKit     0x9164caa3 -[NSNextStepFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 311 
4 com.apple.AppKit     0x915a9ea2 -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 3309 
5 com.apple.AppKit     0x9150aa57 -[NSView displayIfNeeded] + 818 
6 com.apple.AppKit     0x914be661 -[NSNextStepFrame displayIfNeeded] + 98 
7 com.apple.AppKit     0x914d3d40 -[NSWindow displayIfNeeded] + 204 
8 com.apple.AppKit     0x9150528a _handleWindowNeedsDisplay + 696 
9 com.apple.CoreFoundation   0x91397e02 __CFRunLoopDoObservers + 1186 
10 com.apple.CoreFoundation   0x91353d8d __CFRunLoopRun + 557 
11 com.apple.CoreFoundation   0x91353464 CFRunLoopRunSpecific + 452 
12 com.apple.CoreFoundation   0x91353291 CFRunLoopRunInMode + 97 
13 com.apple.HIToolbox     0x9904e004 RunCurrentEventLoopInMode + 392 
14 com.apple.HIToolbox     0x9904ddbb ReceiveNextEventCommon + 354 
15 com.apple.HIToolbox     0x9904dc40 BlockUntilNextEventMatchingListInMode + 81 
16 com.apple.AppKit     0x914db78d _DPSNextEvent + 847 
17 com.apple.AppKit     0x914dafce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156 
18 com.apple.AppKit     0x9149d247 -[NSApplication run] + 821 
19 com.apple.AppKit     0x914952d9 NSApplicationMain + 574 
20 wgv.CamRecorder      0x00001ff9 start + 53 

르 코드

-(void)playMovie 
{ 


NSError *error = nil; 
NSString *pathString = [NSString stringWithFormat:@"/Users/Shared/Real/Movies"]; 

fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:pathString error: &error]; 

NSInteger lenghtOfArray = [fileList count]; 

NSInteger myNewFavoriteRandomNumber = arc4random() % lenghtOfArray; 

NSString *fileName = [NSString stringWithFormat:@"%@",[fileList objectAtIndex:myNewFavoriteRandomNumber]]; 
fileName = [fileName stringByDeletingPathExtension]; 

NSString *fuckDS_Store = [NSString stringWithFormat:@"%@",[fileList objectAtIndex:myNewFavoriteRandomNumber]]; 
if([fuckDS_Store isEqualToString:@".DS_Store"]) 
{ 
    [self playMovie]; 
} 
else 
{ 
    if([lastPlayedVideo intValue] == myNewFavoriteRandomNumber) 
    { 
     if(lenghtOfArray > 3) 
     { 
      [self playMovie]; 

     } 
    } 
    else if([lastPlayedVideo2 intValue] == myNewFavoriteRandomNumber) 
    { 
     if(lenghtOfArray > 3) 
     { 
      [self playMovie]; 
     } 
    } 
    else 
    { 
     lastPlayedVideo2 = lastPlayedVideo; 
     lastPlayedVideo = [NSNumber numberWithInt:myNewFavoriteRandomNumber]; 

     [textfield setStringValue:[fileList objectAtIndex:myNewFavoriteRandomNumber]]; 

     NSError *cperror = nil; 


     NSString* stringMoviePath = [NSString stringWithFormat:@"/Users/Shared/Real/Movies/%@.mov",fileName]; 

     QTMovie* movie = [[QTMovie alloc] initWithFile:stringMoviePath error:&cperror]; 


     if(movie) 
     { 
      [movieViewLoop setMovie:movie]; 
      [movieViewLoop play:@"yes"]; 
     } 
     else 
     { 
      //[self playMovie]; 
      [self performSelector:@selector(playMovie) withObject:@"Oki" afterDelay:1]; 
     } 
    } 

} 
} 
- (void)movieDidEnd:(NSNotification *)aNotification //Every time a movie has been played this is being run 
{ 
    if([blockLoop intValue] == 0) 
    { 
     [self playMovie]; 
    } 
} 
+0

난 당신이 우리에게 다시 몇 번 반복되는 코드를 보여줄 필요가 있다고 생각합니다. – JeremyP

+0

물론 죄송합니다. 조금 아침에 피곤합니다. – tobros91

답변

1

깊이 AppKit의 중첩되어 충돌 코드입니다. 창은 뷰 계층 구조의 일부를 다시 그리는 중입니다. 이 프로세스에서는 설명 된 rectSetBeingDrawnForView: 선택자에 응답하는 (개인) _NSDisplayOperation 개체를 사용합니다.

AppKit에서 잘못 수집 된 표시 작업 객체를 메시지로 보려고하는 것처럼 스택 추적이 나타납니다. 크래시는 코드와 관련이 없습니다.

그럼 어떻게 할 수 있습니까?

  1. File a bug
  2. 않도록 가비지 컬렉션
관련 문제