objective-c - 一段简单的代码,在 GC 下运行良好,但在 ARC 中开始崩溃

标签 objective-c cocoa memory-management automatic-ref-counting

我有以下简单的“检查我的应用程序是否设置为在登录时启动”代码。它在垃圾收集下工作得很好。然而,自从我开始使用 ARC(并根据需要插入“__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;
}

最佳答案

如果该项目未解析,您将在第二次循环中获得双重释放。在开始时以及释放后将 thePath 设置为 nil,这将修复崩溃。

关于objective-c - 一段简单的代码,在 GC 下运行良好,但在 ARC 中开始崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10590649/

相关文章:

cocoa - 以编程方式设置 OS X Lion 全屏桌面图像

python - 重新分配会从 Python 的内存中删除以前的值吗?

ios - 在重置密码之前解析或验证用户名和电子邮件

objective-c - 将 iOS 棋盘游戏移植到 Mac,缺少的部分

iphone - UITextField 不显示键盘

objective-c - 扩展和插件的工作原理

ios - 核心数据属性的自定义 Getter

ios - 更改 FPopover Controller 的颜色

c++ - 为什么 C 和 C++ 编译器将显式初始化和默认初始化的全局变量放在不同的段中?

c++ - 如何减少内存使用 - 可能的内存泄漏