伙计们快点。快速查看下面的代码片段。我分配了 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;
}
编辑:静态分析器的输出...
最佳答案
Instrument 的泄漏检测通过保守地扫描内存、查找指针和构建分配之间的连接图来工作。如果它发现任何指向内存中对象的指针可以从全局变量或堆栈变量访问,则该对象不能被视为泄漏。
仪器不知道指针的布局或上下文。如果您使用 malloc(1024) 并且碰巧在那 block [回收的] 内存中有一堆指针,即使您再也不会将这些指针视为真正的引用,这些指针也算在内。
所以,不,Leaks 永远不可能 100% 准确。同样,泄漏内存的方法远多于实际泄漏。如果你有一个全局缓存,像这样:
NSMutableDictionary *myGlobalCache;
并且您要填充该缓存但永远不要修剪它,这将是一个有效的内存泄漏并且它不可能每次都出现在 Instruments 中。
我写了一篇关于 Heapshot analysis 的深入讨论,这是相关的并且可能是有趣的。
关于objective-c - 为什么仪器找不到这个泄漏点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695959/