Objective c 一个简单的代码,在GC下运行良好,但在ARC中开始崩溃
我有以下简单的“检查我的应用程序是否设置为登录时启动”代码。它在垃圾收集下运行良好。然而,由于我开始使用ARC(并在必要时插入“Objective c 一个简单的代码,在GC下运行良好,但在ARC中开始崩溃,objective-c,cocoa,memory-management,automatic-ref-counting,Objective C,Cocoa,Memory Management,Automatic Ref Counting,我有以下简单的“检查我的应用程序是否设置为登录时启动”代码。它在垃圾收集下运行良好。然而,由于我开始使用ARC(并在必要时插入“\uu bridge”),代码开始随机地、不可预测地崩溃。根据堆栈跟踪,代码在某些CFRelease期间崩溃。你知道ARC下发生这种情况的原因吗 - (BOOL)loginItemExists { NSString *appPath = [[NSBundle mainBundle] bundlePath]; LSSharedFileListRef loginIt
\uu bridge
”),代码开始随机地、不可预测地崩溃。根据堆栈跟踪,代码在某些CFRelease
期间崩溃。你知道ARC下发生这种情况的原因吗
- (BOOL)loginItemExists
{
NSString *appPath = [[NSBundle mainBundle] bundlePath];
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL,
kLSSharedFileListSessionLoginItems, NULL);
BOOL found = NO;
UInt32 seedValue;
CFURLRef thePath;
CFArrayRef loginItemsArray = LSSharedFileListCopySnapshot(loginItems,
&seedValue);
for (id item in (__bridge NSArray *)loginItemsArray)
{
LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;
if (LSSharedFileListItemResolve(itemRef, 0, &thePath, NULL) == noErr)
{
if ([[(__bridge NSURL *)thePath path] hasPrefix:appPath])
found = YES;
}
//docs for LSSharedFileListItemResolve say we should release the CFURLRef
if (thePath != NULL)
CFRelease(thePath);
if (found)
break;
}
CFRelease(loginItemsArray);
CFRelease(loginItems);
return found;
}
您可以通过向特定文件添加编译器标志-fno objc ARC来禁用ARC
如果项目无法解决,您将在第二次循环中获得双重空闲。在开始时以及释放后将路径设置为零,这将修复崩溃。谢谢您的建议。但是,在这种情况下,我不希望禁用ARC,而是尝试了解问题所在。此外,反正ARC没有管理任何东西,因为我正在做常规的
\uu桥接
。这似乎意味着在手动内存管理下也会出现同样的问题。问题似乎是GC->non-GC转换引入了问题。不是弧本身。如果(路径!=NULL)检查是不必要的,您会说我的?我的意思是,CFRelease(NULL)
允许吗?如果是,我的检查可能是不必要的。CFRelease的参数不能为NULL,测试是必需的。