【问题标题】:Objective C: Why is this code leaking?目标 C:为什么这段代码会泄露?
【发布时间】:2011-01-10 02:46:41
【问题描述】:

我正在尝试实现一种类似于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;
}

【问题讨论】:

  • 如果你在 for 循环的中间点击了return YES,你将泄漏数组和引用。

标签: objective-c memory-leaks


【解决方案1】:

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

【讨论】:

  • 如果这是特定于函数的,还是“强制”约定“指针返回”的项目的引用增加?
  • 它是特定于这个函数的,虽然它通常可以从 CoreFoundation 级别的 API 中得到预期,因为 autorelease 只存在于 obj-c 级别。
  • 我尝试发布 itemURL,但仍然有泄漏。我已更新我的代码以反映更改。
  • 只有在测试成功时才会发布它。所以任何没有有你的前缀的URL都会被泄露。
猜你喜欢
  • 2012-06-06
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多