目标C:为什么这段代码泄露了?

时间:2011-01-10 02:46:41

标签: objective-c memory-leaks

我正在尝试实现一种类似于mytunescontroller用来检查它是否已添加到用户登录项的方法。此代码编译时没有警告但如果我运行泄漏性能工具,我会收到以下泄漏:

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;
}

1 个答案:

答案 0 :(得分:3)

LSSharedFileListItemResolve()在第三个参数中返回一个拥有的对象。这可以通过阅读标题来验证。因此,您需要发布itemURL