我正在使用自助服务终端风格的幻灯片应用。我有一个显示幻灯片的UIScrollView
和一个生成幻灯片的工厂类。 “幻灯片”本身是UIViewController
子类,它们从XIB文件加载并由工厂类定制。在我的主视图控制器中,我设置了滚动视图并启动了一个计时器。计时器每隔N秒调用一次“重载”方法,处理重新加载并调用工厂类。
工厂类使用的方法如下所示:
- (SlideViewController *)slideFromManagedObject:(Slide *)managedObject{
NSInteger slideType = [managedObject slideType];
switch(slideType){
case kSlideTypeA:
{
//
// configure arguments here
//
return [[SlideViewController alloc] initWithArgument:argument] autorelease];
break;
}
//
// More types here...
//
default:
break;
}
}
我尚未达到定义所有案例的程度,但填写的案例似乎导致jumps in memory usage。如果我在切换/大小写之前添加return [[[UIViewController alloc] init] autorelease];
,我没有按预期看到可见的视图,但我也没有看到这些内存增加。我不确定,但我怀疑这是我正在包装我的幻灯片生成代码的“C块”。
有些注意事项:
当应用程序启动时,我看到内存平台从大约400千字节到大约两倍。然后,当幻灯片进行时,调用其生成代码包含在花括号中的任何幻灯片,内存平台再次向上。
这种行为似乎每次发布只发生一次 - 当应用程序循环遍历所有幻灯片时,平台再次发生。 然而如果应用程序背景然后重新启动,则会再次出现平台,甚至消耗更多内存。
当我离开应用程序过夜,大约10小时40分钟后,内存使用量从大约1.44兆字节缓慢上升到接近1.57兆字节的某个位置。我怀疑其中有一些其他泄漏可能已经通过我的调整来解决,但是从大约800千字节到1.4到1.5兆字节之间的主要跳跃仍然是一个问题。
仪器没有报告任何泄漏,但平稳时间让我感到担忧。
什么可能导致记忆增加?
修改
所以我不认为这是块,因为使用if / else似乎做同样的事情。 以下是Allocations仪器运行的屏幕截图:
哪些可能会坚持这些观点?
答案 0 :(得分:2)
你所看到的一个可能的解释是UIKit(我假设)正在对你的对象做一些缓存(不知道它们是什么,但我主要想到的是图像)。
缓存通常在过渡期间和UIKit的其他内部使用。
UIKit通常会在收到内存警告时清空其缓存,因此您可以尝试发送一个以查看会发生什么。实际上,我怀疑发送内存警告的结果不是很容易分析,因为你的所有视图都被卸载了,因此内存会强行下降。但你可以试试......
关于如何向设备发送内存警告(而不是模拟器),您可以在这里找到有用的S.O. post。