快一个人.快速浏览下面的代码片段.我分配了UILabel * textLabel,但我没有释放它(注释掉).当方法结束时,我失去了对指针的引用,因此它会泄漏.
事情是,XCode 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; }
编辑:静态分析器的输出……
解决方法
仪器的泄漏检测通过保守扫描内存,寻找指针和构建分配之间的连接图来实现.如果它找到了可以从全局变量或堆栈变量到达的内存中对象的任何指针,则该对象不能被视为泄漏.
仪器不知道指针的布局或上下文.如果你是malloc(1024)并且在那个[再循环]的内存块中碰巧有一堆指针,即使你再也不会将这些指针视为真正的引用,这些指针也会计算在内.
所以,不,泄漏永远不会100%准确.同样,泄漏内存的方法远远多于实际泄漏.如果你有一个全局缓存,像这样:
NSMutableDictionary *myGlobalCache;
你要填充缓存,但从不修剪它,这将是一个有效的内存泄漏,并且没有任何方式它会出现在仪器中.
我写了一篇关于Heapshot analysis的深入讨论,这是相关的,也可能是有意义的.