Сбои с EXC_BAD_ACCESS с сборкой мусора после нескольких часов работы - PullRequest
1 голос
/ 01 марта 2011

У меня есть приложение, в котором несколько видео отображаются в случайном порядке, и все было прекрасно и работало отлично.Так как они программируют циклы один и тот же код снова и снова, я нахожу это очень странным, что просто внезапно останавливается.О чем может быть ниже сообщение об ошибке?

Но через много часов оно вылетает.Первый раз он работал за 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

Le Code

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

1 Ответ

1 голос
/ 01 марта 2011

Код, который вылетает, глубоко вложен в AppKit.Окно занято перерисовкой части своей иерархии представления.В этом процессе он использует (приватные) _NSDisplayOperation объекты, которые реагируют на упомянутый селектор rectSetBeingDrawnForView:.

Трассировка стека выглядит так, будто AppKit пытается сообщить ошибочно собранный объект операции отображения.Сбой, вероятно, не имеет никакого отношения к вашему коду.

Итак, что вы можете с этим поделать?

  1. Отправить ошибку
  2. Избегайте сбора мусора
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...