Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 一个简单的代码,在GC下运行良好,但在ARC中开始崩溃_Objective C_Cocoa_Memory Management_Automatic Ref Counting - Fatal编程技术网

Objective c 一个简单的代码,在GC下运行良好,但在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

我有以下简单的“检查我的应用程序是否设置为登录时启动”代码。它在垃圾收集下运行良好。然而,由于我开始使用ARC(并在必要时插入“
\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,测试是必需的。