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