2011-01-10 37 views
0

我试图实现类似于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; 
} 
+0

如果你在for循环的中间命中了`return YES`,你会泄漏数组和ref。 – 2011-01-10 03:03:27

回答

3

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

+0

如果这是特定于函数还是“强制”的约定,那么“由指针返回”项的参数会增加? – 2011-01-10 03:00:47