gpt4 book ai didi

objective-c - C 风格的 block 会导致内存泄漏吗?

转载 作者:太空狗 更新时间:2023-10-30 03:45:21 25 4
gpt4 key购买 nike

我正在开发一个信息亭风格的幻灯片应用程序。我有一个显示幻灯片的 UIScrollView 和一个生成幻灯片的工厂类。 “幻灯片”本身是UIViewController的子类,从XIB文件中加载出来,由工厂类自定义。在我的主视图 Controller 中,我设置了 ScrollView 并启动了一个计时器。计时器每 N 秒调用一次“reload”方法,该方法处理重新加载和调用工厂类。

工厂类使用的方法看起来像这样:

- (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 .如果我在 switch/case 之前添加 return [[[UIViewController alloc] init] autorelease];,正如预期的那样,我看不到任何可见 View ,但我也没有看到那些内存增加。我不确定,但我怀疑这是我包装幻灯片生成代码的“C block ”。

一些注意事项:

  • 当应用程序启动时,我看到内存稳定状态从大约 400 KB 到大约两倍。然后,当幻灯片进行时,任何生成代码包含在大括号中的幻灯片都会被调用,内存再次上升。

  • 此行为似乎在每次启动时只发生一次 - 当应用程序循环播放所有幻灯片时,平稳状态_not_再次发生。 但是如果应用程序在后台运行然后重新启动,稳定状态会再次出现,消耗甚至更多内存。

  • 当我让应用程序整夜运行时,大约 10 小时 40 分钟,内存使用量已从大约 1.44 兆字节缓慢攀升至接近 1.57 兆字节的某个位置。我怀疑那里还有其他一些泄漏可能已通过我的调整得到修复,但从大约 800 KB 到 1.4 到 1.5 MB 之间的主要跳跃仍然是一个问题。

仪器没有报告任何泄漏,但稳定让我担心。

什么可能导致内存增加?

编辑:

所以我不认为它是 block ,因为使用 if/else 似乎做同样的事情。这是 Allocations instrument 运行的屏幕截图:

enter image description here

哪些地方可能坚持这些观点?

最佳答案

对于您所看到的情况,一个可能的解释是 UIKit(我假设)正在对您的对象进行一些缓存(不知道它们是什么,但我主要想到图像)。

缓存通常在转换期间和 UIKit 的其他内部使用。

UIKit 通常会在收到内存警告时清空其缓存,因此您可以尝试发送一个以查看会发生什么。实际上,我怀疑发送内存警告的结果不太容易分析,因为您所有的 View 也已卸载,因此内存将被强制关闭。但是你可以试试...

关于如何向设备(与模拟器相对)发送内存警告,您可以在这里找到有用的 S.O. post .

关于objective-c - C 风格的 block 会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com