【问题标题】:Memory leak every time UIScrollView is released每次释放 UIScrollView 时内存泄漏
【发布时间】:2012-04-03 12:21:22
【问题描述】:

在我的应用程序中,我有一个滚动视图和四个表格视图。每次拖动然后释放,我都会得到一个 48 字节的泄漏。这真的加起来了。如您所见,两组泄漏具有相同的来源。有没有人见过这样的泄漏?




编辑 1:

当我单击泄漏旁边的箭头时,我会得到有关泄漏的以下信息:

【问题讨论】:

    标签: ios memory-leaks uiscrollview instruments


    【解决方案1】:

    解决方法:我发现handlePan发生内存泄漏:如果设置了UIScrollView委托。我需要委托方法,所以我继承了 UIScrollView,并声明了我自己的 @protocol。然后我覆盖了 scrollView panGestureRecognizer 的目标选择器,而不将其发送给 super:

    //yourScrollView.h
    @protocol yourScrollViewDelegate
    -(void)yourProtocol;
    @end
    
    //yourScrollView.m
    -(void)handlePan:(id)sender{
       [yourDelegate yourProtocol];
    }
    

    【讨论】:

      【解决方案2】:

      解决方法:

      我意识到这个泄露的字节不知何故存储在滚动视图中。 您必须不时释放滚动视图并再次分配它,保持其状态。 您检测何时应该重新加载滚动视图的方式取决于您的应用程序需求。每次释放滚动视图时,这些字节也会被释放。

      【讨论】:

      • 不,我得到了不时分配和释放的滚动视图和表视图,这并不能解决泄漏问题。解决方法就是等待ios官方修复。
      【解决方案3】:

      您看到的是 iOS 5.1 中的一个已知错误,并且正在 iOS 开发者论坛中进行讨论。您可以通过在论坛中搜索“strdup”来找到相关主题。请参阅标题为“Elements App Memory Leak”的主题。搜索来自 Apple 员工的帖子。

      【讨论】:

      • 啊,我明白了。看起来在这方面没有什么可以做的。感谢您的回复!
      • 当然,这就是 Stack 的全部意义......得到答案!
      【解决方案4】:

      不知何故,很可能是你的错。

      在分配工具中,按“i”按钮并打开“记录引用计数”。然后 Instruments 可以向您显示发生在这些对象上的所有分配、保留、自动释放和释放事件。 (您应该会在每个泄露的项目旁边看到一个箭头——单击它以显示该对象的分配历史记录。)

      我想你会发现你的一些代码保留了一些东西,或者间接导致它被保留。猜测可能是滚动视图或其手势识别器之一。

      【讨论】:

      • 记录引用计数已打开,但我如何从分配中查看泄漏的对象?我可以在 Leaks (duh) 中看到泄漏的对象,但我看不到它们被保留/释放/自动释放的位置。
      • 我刚刚使用 Xcode 4.3.1 进行了尝试,使用了 Instruments 中的“Leaks”预设。记录引用计数已打开。在泄露对象列表中,在“地址”列中,有一个箭头图标——单击该图标可显示该地址的历史记录。如果箭头没有出现,我建议最好使用 Instruments 中的设置。
      • 找到了,但那里的信息不是很有帮助。编辑我的结果。
      • 其实不是他的错。我能够用一个最低限度的应用程序重复这个确切的泄漏。每次滚动它时,它都会在 libsystem_c.dylib 中泄漏 48 个字节。表格视图和滚动视图也是如此。
      • 是的,我同意,在这一点上,这显然是 Apple 的错误。这是我第一次看到它的报告,通常很少会在框架中发现如此明显的泄漏。
      猜你喜欢
      • 2012-06-08
      • 2014-09-19
      • 2011-01-27
      • 1970-01-01
      • 2020-11-22
      • 2014-08-26
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多