2011-03-01 55 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 2011-03-01 09:11:45

+0

當然對不起,早上的疲倦幾乎沒有 – tobros91 2011-03-01 09:27:44

回答

1

的崩潰深深地嵌在了AppKit的代碼。該窗口正忙於重繪其視圖層次結構的一部分。在這個過程中,它使用一個(私有)_NSDisplayOperation對象,它響應上述rectSetBeingDrawnForView:選擇器。

堆棧跟蹤看起來像AppKit嘗試向錯誤收集的顯示操作對象發送消息。崩潰可能與您的代碼無關。

那麼,你能做些什麼呢?

  1. File a bug
  2. 避免垃圾收集