mytunescontrollerがユーザーのログイン項目に追加されているかどうかを確認するために使用する方法と似た方法を実装しようとしています。このコードは、警告なしでコンパイルが、私はリークのパフォーマンスツールを実行する場合、私は、次のリークを取得:目的C:なぜこのコードが漏れていますか?
Leaked Object # Address Size Responsible Library Responsible Frame
NSURL 7 <multiple> 448 LaunchServices LSSharedFileListItemGetFSRef
NSCFString 6 <multiple> 432 LaunchServices LSSharedFileListItemGetFSRef
ここで犯人です:
- (BOOL)isAppStartingOnLogin
{
LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginListRef) {
NSArray *loginItemsArray = (NSArray *)LSSharedFileListCopySnapshot(loginListRef, NULL);
NSURL *itemURL;
for (id itemRef in loginItemsArray) {
if (LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef, 0, (CFURLRef *) &itemURL, NULL) == noErr) {
if ([[itemURL path] hasPrefix:[[NSBundle mainBundle] bundlePath]]) {
[loginItemsArray release];
[itemURL release];
CFRelease(loginListRef);
return YES;
}
}
}
[itemURL release];
[loginItemsArray release];
CFRelease(loginListRef);
}
return NO;
}
forループの途中で 'return YES'を押すと、配列とrefをリークします。 –