我正在构建一个启用了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;
}
许多人早些时候遇到过这个问题,但没有答案对我有用。 如果有人对此有任何想法......请帮助。
答案 0 :(得分:0)
尝试阅读本文,可能会有所帮助。
另外,请考虑查看ARC提供的@autoreleasepool机制,以帮助限制最大内存占用。
另外,请确保调用上面列出的方法。有时我们会编写清理程序,但它们不会被调用! : - )
此外,您将代码列为:
axisSet =零 generationPlot =零 ...等等...
什么类型的轴集?是什么类型的generationPlot?全局变量?如果他们不是NSObject(有时即使他们是),将它们设置为nil可能不是解除分配它们的正确方法。
考虑将它们中的一些设为@property并给它们适当的限定符(即:strong等),然后你的一些内存使用可能会更清晰一些。如果你有许多静态或全局变量可能会造成一些混乱。
希望这有帮助。