Cocoa应用程序崩溃与EXC_BAD_ACCESS,但只在Mac OS X 10.6.6
问题描述:
我收到了一些来自运行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;
}
答
一般来说,在.x.y版本的变化应该不会导致以前工作的应用程序崩溃。我建议你在bugreport.apple.com上提交一个错误。
我相信你有一个内存管理错误。你为什么要发布`url`(`if(url)CFRelease(url)`)?你没有从`new`,`alloc`或`copy`中得到它,你也没有保留它。 – kevingessner 2011-01-28 18:39:26
URL在LSSharedFileListItemResolve中分配。我想过的一件事是我为数组调用释放而不是CFRelease。也许这就是问题...... – Mark 2011-01-28 19:04:50