4

我正在构建一个启用了 ARC 的图形相关应用程序,其中图形上有两个不同的视图:-一个是小视图,我必须通过单击按钮来更改(使用重新加载数据)。-第二个视图是当点击“1 天”、“3 天”、“5 天”等按钮时图表发生变化的大视图。

我面临的问题是,在连续使用 15-20 分钟后,应用程序会因日志崩溃......“CAAnimation 无法分配字节”。当我在 Profile 上进行分析时,我了解到当小图加载时,实时字节会跳跃 2-3 mb,而当大图加载时,实时字节会跳跃 4 到 5 mb,而实时字节则永远不会下降。我在离开视图时取消了所有图形对象,但即便如此,内存也没有释放。

在切换到下一个图表时,我正在调用此方法:

-(void)removePlot
{
    for(CPTPlot* plot in [graph allPlots])
    {
        plot.dataSource = nil;
        plot.delegate = nil;
        [plot deleteDataInIndexRange:NSMakeRange(0, plot.cachedDataCount)];
        [graph removePlot:plot];
    }
}

在离开视图时,我正在调用此方法:

-(void)removeGraph
{
    [axisSet removeFromSuperlayer]; 
    axisSet=nil;
    [self removePlot];
    generationPlot=nil;
    [graph removePlotSpace:plotSpace];
    plotSpace=nil;
    [graph removeFromSuperlayer];
    graph=nil;
    [hostView removeFromSuperview];
    hostView=nil;
    headerList=nil;
    graphDetailList=nil;
    graphList=nil;
    dataList=nil;
    plotsArray=nil;
}

很多人之前都遇到过这个问题,但还没有答案对我有用。如果有人对此有任何想法......请提供帮助。

4

1 回答 1

0

尝试阅读本文,它可能会有所帮助。

https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

此外,请考虑研究 ARC 提供的 @autoreleasepool 机制,以帮助限制最大内存占用。

此外,请确保正在调用您上面列出的方法。有时我们会编写清理例程,但它们不会被调用!:-)

此外,您将代码列为:

axisSet=nil generationPlot=nil ...等...

axisSet 是什么类型的?generationPlot 是什么类型的?全局变量?如果它们不是 NSObjects(有时即使它们是),将它们设置为 nil 可能不是释放它们的正确方法。

考虑将其中一些设置为@property 并给它们适当的限定符(即:强等),那么您的一些内存使用情况可能会更清晰一些。如果您有许多可能引起混淆的静态或全局变量。

希望这可以帮助。

于 2014-03-16T01:07:08.957 回答