objective-c - 为什么仪器找不到这个泄漏点?

标签 objective-c xcode memory-management static-analysis instruments

伙计们快点。快速查看下面的代码片段。我分配了 UILabel *textLabel 但我没有释放它(注释掉)。当方法结束时,我失去了对指针的引用,所以它泄漏了。

问题是 XCode Instruments 没有发现这个漏洞,我原以为它很容易找到它。它没有报告我的应用程序中有任何泄漏,但我自己发现了这个,这让我有点怀疑。

是我检查过度了还是 Instruments 检测泄漏的能力很差?

-(UITableViewCell*)newReadOnlyCellWithTitle:(NSString*)title andText:(NSString*)text {
    UITableViewCell *cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
    cell.textLabel.text=title;
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    cell.backgroundColor=[UIColor whiteColor];
    cell.opaque=YES;

    UILabel *textLabel=[[UILabel alloc] initWithFrame:CGRectMake(80, 11, 350, 24)];
    textLabel.text=text;
    textLabel.textColor=[UIColor lightTextColor];
    textLabel.font=[UIFont fontWithName:STANDARD_FONT size:16.0];
    textLabel.opaque=YES;
    textLabel.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:textLabel];
    //[textLabel release]; //<== without the release this should leak, yep?
    return cell;
}

编辑:静态分析器的输出...

enter image description here

最佳答案

Instrument 的泄漏检测通过保守地扫描内存、查找指针和构建分配之间的连接图来工作。如果它发现任何指向内存中对象的指针可以从全局变量或堆栈变量访问,则该对象不能被视为泄漏。

仪器不知道指针的布局或上下文。如果您使用 malloc(1024) 并且碰巧在那 block [回收的] 内存中有一堆指针,即使您再也不会将这些指针视为真正的引用,这些指针也算在内。

所以,不,Leaks 永远不可能 100% 准确。同样,泄漏内存的方法远多于实际泄漏。如果你有一个全局缓存,像这样:

 NSMutableDictionary *myGlobalCache;

并且您要填充该缓存但永远不要修剪它,这将是一个有效的内存泄漏并且它不可能每次都出现在 Instruments 中。

我写了一篇关于 Heapshot analysis 的深入讨论,这是相关的并且可能是有趣的。

关于objective-c - 为什么仪器找不到这个泄漏点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695959/

相关文章:

objective-c - AVPlayer不播放视频

iphone - Xcode 4 跳过将应用程序复制到设备/模拟器

c++ - 将本地 OpenCV Mat 变量声明为静态变量以防止重新分配

ios - 如何以编程方式打开WhatsApp,然后返回我的应用程序?

iphone - 核心数据问题 : -[NSManagedObject setValue:]: unrecognized selector sent to instance

iphone - 音乐播放器只播放一首轨道

ios - 无法使用带有 : (Any), 选项的类型参数列表调用 jsonObject:[任何]

swift - 在 Swift 3 和 Xcode 中使用堆栈 View 按钮打开 Storyboard View

生命周期依赖于拥有对象的 C# (.NET) 对象

c - 使用 strtok() 函数时的内存分配