0

我正在尝试遵循 Apple 的建议来处理内存不足警告(在 WWDC 2009 视频的 Session 416 中找到),方法是通过释放包含大量字符串的 dataController 对象(在我的应用程序委托中引用)来释放使用的资源从 plist 中读取:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
   [_dataController release];
   _dataController = nil;
   NSLog([NSString stringWithFormat:@"applicationDidReceiveMemoryWarning bottom...      retain count:%i", [_dataController retainCount]]);
}      

但是当我在 Instruments 中运行 ObjectAlloc 并模拟低内存条件时,我没有看到我的应用程序使用的内存减少,即使我看到 NSLog 语句被写出并且对象的保留计数为零。我确实将应用程序委托的引用传递给了一些视图控制器。但是上面的代码释放了对 _dataController 对象(包含 plist 数据)的引用,所以我希望内存被释放。

任何帮助,将不胜感激。

4

2 回答 2

1

您确定应用程序委托是 的唯一所有者_dataController吗?-release只会减少引用计数,除非引用计数降至零,否则它不会释放对象。

如果_dataController也被其他对象拥有,则向他们发送消息以释放它。

于 2010-04-22T06:04:47.747 回答
0

我正在仔细检查。感谢您的输入!我确实重新阅读了 Apple 的内存管理文档,并且确实在我的 DataController 的 dealloc 方法中放置了一个 NSLog 语句,并且它正在被调用。我还把发布前的retain count写了出来,并设置为_dataController的nil。保留计数为 1。

所以这让我回到了为什么我没有看到内存使用量显着减少。我想我需要更好地理解 Instruments 中的 ObjectAlloc 显示,以及我的应用程序中最大的内存分配发生在哪里。在这方面寻求帮助后,我对尝试从 Instruments 确定发生这种情况的位置感到沮丧。我可以看到“所有分配”有 3.54 MB,Malloc 32.00 KB 有 608 MB。如果我深入了解 Malloc,我只会将责任调用者视为框架调用,例如 png_malloc 和 inflateEnd。我正在我的代码中寻找负责 Malloc 的调用,但我没有看到。所有这一切都说明我想知道我是否正在释放一个或多个对象,这些对象会真正对用于低内存条件的内存量产生显着影响。我想我需要一个深入的 Instruments 教程。Apple 帮助文档还可以,但带有代码的示例会更有帮助。

于 2010-04-23T15:29:48.117 回答