2011-01-28 139 views
0

我收到了一些來自運行Mac OS X 10.6.6的用戶的崩潰報告。我的應用程序崩潰,錯誤如下:Cocoa應用程序崩潰與EXC_BAD_ACCESS,但只在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上工作)。

任何人都可以看到爲什麼會發生?我查看該代碼的方式太長了,而我沒有看到它。

謝謝! 馬克

+ (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; 
} 
+1

我相信你有一個內存管理錯誤。你爲什麼要發佈`url`(`if(url)CFRelease(url)`)?你沒有從`new`,`alloc`或`copy`中得到它,你也沒有保留它。 – kevingessner 2011-01-28 18:39:26

+1

URL在LSSharedFileListItemResolve中分配。我想過的一件事是我爲數組調用釋放而不是CFRelease。也許這就是問題...... – Mark 2011-01-28 19:04:50

回答

0

不知道這一點,你所遇到的問題,但我已經使用這個代碼爲我的應用程序,它可以正常使用Enabling launch on startup

2

一般來說,在.x.y版本的變化應該不會導致以前工作的應用程序崩潰。我建議你在bugreport.apple.com上提交一個錯誤。

相關問題