【发布时间】:2016-09-17 16:04:08
【问题描述】:
我刚开始第一次使用 SceneKit 和 SpriteKit 以及 ARC 创建应用程序。我注意到当我在不同的视图之间切换时,内存使用量正在迅速增加。我的第一个想法是我有内存泄漏,但我现在不确定。该行为甚至出现在这个基本示例中:
for(int r=0;r<9999999;r+=1){
NSString *s=[NSString stringWithFormat:@"test%i",r];
s=nil;
}
据我了解,在此循环中创建并直接释放 NSString 对象。我已经在 iPhone-Simulator 和 iPhone 上尝试过这个示例,它使应用程序在执行此循环后使用数百 MB 的 RAM。 (我正在使用 Xcode 调试导航器检查内存使用情况)
我显然误解了一些东西。为什么这个例子之后仍然保留内存?
编辑:
您也可以创建一个新项目:iOS -> 游戏 -> 游戏技术:SceneKit
然后将其添加到 viewDidLoad 中:
for(int r=0;r<999999;r+=1){
SCNNode *tn=[SCNNode node];
tn=nil;
}
内存将在 550MB 达到峰值,然后降至 300MB,如果有对象被完全释放并从 RAM 中删除,这将是太多了。
【问题讨论】:
-
顺便说一句,您可以尝试模拟内存压力。 Cocoa 对象会进行各种缓存,其中一些会在出现内存警告时被清除。此外,如果您在方案中打开了任何内存调试选项(尤其是僵尸程序),请注意这些会导致额外的内存增长,并且您可能希望在分析泄漏、废弃或缓存的内存之前将其关闭。
-
感谢您帮助我解决这个问题。我没有打开僵尸,但你的建议让我关闭了所有调试设置,这让问题消失了。所以这个问题都和调试特性有关。
-
优秀。我已将其纳入下面的答案中。
-
'模拟内存警告'在这种情况下没有帮助,在我尝试的示例中它只释放了 1MB 或更少。
-
即使是简单的示例,也可能存在自动释放池。可能不在这里,但您可能会感到惊讶。
标签: objective-c automatic-ref-counting