2

次の簡単な「アプリがログイン時に起動するように設定されているかどうかを確認する」コードがあります。ガベージコレクションでうまくいきました。しかし、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;
}
4

2 に答える 2

4

アイテムが解決しない場合、ループを介して2回目はここでダブルフリーになります。最初とリリース後にthePathをnilに設定すると、クラッシュが修正されます。

于 2012-05-15T01:04:57.540 に答える
-1

コンパイラ フラグ -fno-objc-arc を特定のファイルに追加することで、ARC を無効にすることができます。 ここに画像の説明を入力

于 2012-05-14T20:39:09.270 に答える