为啥我有内存泄漏?我无法解决

Posted

技术标签:

【中文标题】为啥我有内存泄漏?我无法解决【英文标题】:Why do I have a memory leak? I can't work it out为什么我有内存泄漏?我无法解决 【发布时间】:2010-08-25 21:07:29 【问题描述】:

我在 Instruments 中遇到了内存泄漏...我之前已经整理过一些,但是这个让我很困惑!如果您能提供帮助,我将不胜感激...这是泄漏的方法...它接收数据字典,基于它创建一个新字典并返回它。我已经评论了泄漏的行,以及泄漏的百分比(不确定这是怎么回事),我尝试通过选择 alloc/init/release 而不是 autorelease 来清理一下,但是好像没什么区别……

- (PetalLayerView *)makePetalLayerWithData:(NSDictionary *)sectionData isZeroIndexed(BOOL)zeroIndexed

    NSMutableSet *petalsData = [[NSMutableSet alloc] init];       // 7.2%
    NSArray *sections = [sectionData objectForKey:@"sections"];

    NSNumber *startIndex, *endIndex;
    NSDictionary *petalData;
    for(int i=0; i<sections.count; i++)
    
        startIndex = [sections objectAtIndex:i];

        if(i < sections.count - 1)
             endIndex = [sections objectAtIndex:i+1];
        else
             endIndex = [sections objectAtIndex:0];

        if(!zeroIndexed)
        
             startIndex = [NSNumber numberWithInt:[startIndex intValue]-1];   // 10.2%
             endIndex   = [NSNumber numberWithInt:[endIndex   intValue]-1];   // 10.5%
        

        petalData = [[NSDictionary alloc] initWithObjectsAndKeys:startIndex, @"startIndex", endIndex, @"endIndex", nil];   // 64.4%
        [petalsData addObject:petalData];   // 7.7%
        [petalData release];
   

   int maxLength = MAX(self.frame.size.width, self.frame.size.height);
   CGRect petalFrame = CGRectMake((self.frame.size.width - maxLength)/2, (self.frame.size.height - maxLength)/2, maxLength, maxLength);
   PetalLayerView *petalLayerView = [[[PetalLayerView alloc] initWithFrame:petalFrame] autorelease];

   NSString *tagGroupName = [sectionData objectForKey:@"section_name"];

   WheelModel *wheelModel = [WheelModel sharedInstance];

   if([sectionData objectForKey:@"filtered"])
   
        petalLayerView.outlineColor = [wheelModel.tagColors objectForKey:tagGroupName];
   
   petalLayerView.petalColor = [wheelModel.petalColors objectForKey:tagGroupName];
   petalLayerView.petalsData = petalsData;
   [petalsData release];

   return petalLayerView;

非常感谢任何帮助!谢谢!

:-乔

【问题讨论】:

构建和分析说什么?在这样的方法中发现潜在的泄漏通常非常好。 【参考方案1】:

你确定你在泄漏内存吗?花瓣数据被花瓣层视图保留(大概),因此所有正在分配的数据都不应该消失(即,它不是泄漏,而是有意分配的)。我想,视图本身可能会被泄露,但这超出了所提供代码的范围。

【讨论】:

谢谢......我在你写这个答案时发现了这一点。泄漏根本不存在,而是在 PetalLayerView 中(正如您所建议的那样)。 PetalLayerView 没有在 dealloc 中释放任何它的 ivars ......我很愚蠢,我没有意识到我必须跟踪泄漏到连接的对象。感谢您的帮助:)【参考方案2】:

你需要在petalData = [[NSDictionary alloc] ...之后释放startIndex和endIndex

【讨论】:

不,新创建的是autoreleased,从数组中获取的也是不拥有的。参见例如Object Ownership Policy.

以上是关于为啥我有内存泄漏?我无法解决的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OpenCV Mat 会造成内存泄漏?

为啥在 Qt 中继承 QWidget 类时出现内存泄漏

为啥 QApplication 会出现内存泄漏?

为啥 Instruments 将此报告为内存泄漏?

为啥迁移到 ARC 后我的应用程序充满了内存泄漏?

当我在 Thread 对象上调用 run() 时,为啥我的 Java 程序会泄漏内存?