我正在构建一个启用了 ARC 的图形相关应用程序,其中图形上有两个不同的 View : -一个是小 View ,我必须通过单击按钮(使用重新加载数据)来更改它。 - 第二个 View 是较大的 View ,当单击“1 天”、“3 天”、“5 天”等按钮时,图表会发生变化。
我面临的问题是,在连续使用 15-20 分钟后,应用程序崩溃并显示日志...“CAAnimation 无法分配字节”。 当我在 Profile 上分析时,我了解到当加载小图形时,事件字节会跳跃 2-3 mb,而当加载大图形时,事件字节会跳跃 4 到 5 mb,并且事件字节永远不会下降。 我在离开 View 时清空了所有图形对象,但即使这样内存也没有释放。
在切换到下一张图时我调用了这个方法:
-(void)removePlot
{
for(CPTPlot* plot in [graph allPlots])
{
plot.dataSource = nil;
plot.delegate = nil;
[plot deleteDataInIndexRange:NSMakeRange(0, plot.cachedDataCount)];
[graph removePlot:plot];
}
}
在离开 View 时我调用了这个方法:
-(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;
}
很多人早些时候都遇到过这个问题,但还没有对我有用的答案。 如果有人对此有任何想法...请提供帮助。
最佳答案
尝试阅读这篇文章,它可能会有所帮助。
此外,考虑研究 ARC 提供的 @autoreleasepool 机制以帮助限制最大内存占用。
此外,请确保调用上面列出的方法。有时我们编写了清理例程,但它们没有被调用! :-)
此外,您将代码列为:
axisSet=无 generationPlot=无 ……等……
axisSet 是什么类型? generationPlot 是什么类型?一个全局变量?如果它们不是 NSObjects(有时即使它们是),将它们设置为 nil 可能不是释放它们的正确方法。
考虑将它们中的一些设为@property 并赋予它们适当的限定符(即:strong 等),这样您的一些内存使用情况可能会更清楚一些。如果您有多个静态变量或全局变量可能会造成一些困惑。
希望这对您有所帮助。
关于iphone - arc 的核心图内存消耗问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141400/