release在低内存条件下不会释放内存

时间:2010-04-22 06:01:10

标签: iphone memory-management low-memory

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

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

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

如果_dataController也归其他对象所有,请向他们发送消息以释放它。

答案 1 :(得分:0)

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

因此,这让我想起了为什么我没有看到内存使用量显着减少的原因。我想我需要更好地了解Instruments中的ObjectAlloc显示以及我的应用程序中最大的内存分配。在这个领域寻求帮助后,我很沮丧,试图从仪器中确定这种情况发生的地方。我可以看到“All Allocations”有3.54 MB,Malloc 32.00 KB有608 MB。如果我深入研究Malloc,我只看到Responsible Caller是png_malloc和inflateEnd之类的框架调用。我在我的代码中寻找负责Malloc的调用,但我没有看到。所有这些都说我想知道我是否正在发布一个或多个对象,这些对象或内容确实会对用于低内存条件的内存量产生重大影响。我想我需要一本深入的仪器教程。 Apple帮助文档没问题,但代码示例会更有帮助。