Какао-приложение аварийно завершает работу с EXC_BAD_ACCESS, но только в Mac OS X 10.6.6 - PullRequest
0 голосов
/ 28 января 2011

Я получил пару отчетов о сбоях от пользователей Mac OS X 10.6.6. Мое приложение вылетает с ошибкой ниже:

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

Application Specific Information:
objc_msgSend() selector name: release


Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                0x97d98edb objc_msgSend + 27
1   com.apple.LaunchServices       0x9038dc62 __LSSharedFileListItemDeallocate + 126
2   com.apple.CoreFoundation       0x9489d101 _CFRelease + 353
3   com.apple.CoreFoundation       0x948c75b2 __CFArrayReleaseValues + 210
4   com.apple.CoreFoundation       0x9489d101 _CFRelease + 353
5   ...myapp.AppName 0x00005d67 +[ABTools isLoginItem] + 1597

Код, который ломается, пытается определить, установило ли приложение элемент входа в систему. С третьей по последнюю строку освобождение массива завершается неудачно (на 10.6.6, работает на 10.5.8).

Кто-нибудь может понять, почему это произошло? Я слишком долго смотрел на этот код и не вижу его.

Спасибо! Mark

+ (BOOL) isLoginItem {

    BOOL isLoginItem = NO;

    UInt32 seedValue;

    NSString *appName = [NSString stringWithFormat:@"%@.app", [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]];
    NSString *appPath = [[NSBundle mainBundle] bundlePath];

    LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL,kLSSharedFileListSessionLoginItems,NULL);
    if (!loginItems) {
        return isLoginItem;
    }
    CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:appPath];

    NSArray *loginItemsArray = (NSArray *)LSSharedFileListCopySnapshot(loginItems, &seedValue);

    if (!loginItemsArray) {
        return isLoginItem;
    }
    for (id item in loginItemsArray)
    {  
        if (LSSharedFileListItemResolve((LSSharedFileListItemRef)item,0,(CFURLRef*)&url,NULL) == noErr
            && [[(NSURL *)url path] isEqualToString:appPath]) {

            isLoginItem = YES;
        }
        if (url) CFRelease(url);
    }

    if (loginItemsArray) [loginItemsArray release]; // THIS FAILS ON Mac OS X 10.6.6
    if (loginItems) CFRelease(loginItems);

    return isLoginItem;
}

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Как правило, изменения в выпусках .x.y не должны вызывать сбой ранее работающих приложений. Я предлагаю вам сообщить об ошибке на bugreport.apple.com.

0 голосов
/ 29 января 2011

Не уверен насчет проблемы, с которой вы столкнулись, но я использовал этот код для своего приложения, и он отлично работает Включение запуска при запуске

...