【问题标题】:memory allocation in custom initialization自定义初始化中的内存分配
【发布时间】:2015-12-16 11:16:28
【问题描述】:

在我的代码上运行分配分析器。在插入的代码上发现以下问题。有人可以指出我的代码有什么问题。添加图片以显示颜色编码。

点初始化代码如下:

@autoreleasepool {

if(!coordString){
    return nil;
}
if([coordString length]<3){
    return nil;
}

__weak NSArray* coords=[coordString componentsSeparatedByString:@","];
    if(nil != coords && ([coords count]==2)){
    self = [super init];
    if(nil != self){
        self.coordX=  [[coords objectAtIndex:0] doubleValue];
        self.coordY = [[coords objectAtIndex:1] doubleValue];

        return self;
    }else {
        return nil;
    }

    }else{

        return nil;
    }
}

请提出问题可能出在哪里。 分配快照指示持久性内存。

【问题讨论】:

  • 您的代码没有任何意义。屏幕截图显示了不同的代码,您发布的内容看起来像是一个混乱的 init 方法与某种 getter 相结合。
  • Avi,如果您仔细阅读评论,屏幕截图是平面对象的初始化,它使用另一个点对象的代码初始化,其中探查器以红色突出显示。作为参考,我添加了该行引用的代码。所以你可能误解了这个问题。
  • 我明白了。感谢您的澄清。究竟是什么问题?您是否在某处看到内存泄漏?顺便说一句,您可能不应该在初始化程序中包含 @autorelease 块。
  • 您在此处发布的视图是终身分配,而不是当前分配。预计会上涨。
  • 我没有看到泄漏,但没有任何其他上下文的快照不会显示任何内容。无法告诉您在应用程序的哪个位置保留了第二张屏幕截图中仍然存在的 237 个实例。

标签: ios objective-c memory-leaks profiler


【解决方案1】:
  • 对于内存相关问题(例如我上面的问题提出的问题)没有直接明确的解决方案,因为代码中没有明确的错误。泄漏没有挑选任何具体的东西。因此,上面的@Avi 给了我一个提示,即“持久”表示已放弃的分配。所以他上面的评论给了我一个方向,我需要研究其他地方的问题。
  • 没有看过的人,应该花时间了解使用链接上的 Instrument 处理内存问题https://developer.apple.com/videos/play/wwdc2012-242/
  • 更重要的是为您创建此类类的“dealloc”函数并为您的代码创建解除分配代码并将指针设置为 nil。在我上面的例子中,我确保使用以下代码做到这一点:

    -(void) 解除分配{ if(nil != self.arrVertices && [self isKindOfClass:[SPCPlane2D class]]){ [self.arrVertices removeAllObjects]; } self.arrVertices=nil; }

经过几个小时的进一步挖掘,我得到了如下所示的仪器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2012-12-04
    • 2021-07-13
    • 2012-01-30
    • 1970-01-01
    • 2021-07-07
    • 2015-11-08
    相关资源
    最近更新 更多