全局变量的神秘内存损失?

时间:2011-02-26 19:46:46

标签: ios memory-management

在我的代码中,我创建了一个名为Events的全局变量(在.h文件中没有对应项)。这是一个NSMutableArray。它只能由它定义的类访问。

当调用“viewDidLoad”时,我的代码做了很多事情: 首先,它初始化事件。然后,它创建7个NSMutableArrays,并将它们添加到Events对象。

viewDIdLoad继续进行一些UI设置,通过创建分配按钮并确保将它们放入另一个NSMutable数组进行跟踪。

在viewDidLoad完成执行之前,Events对象工作正常并且花花公子。如果我按下其中一个生成的按钮,并且该按钮试图访问事件,则系统崩溃。

我做了很多调试,试图弄清楚出了什么问题,我把它缩小到了这个范围:

我的代码完成后的一段时间,事件完全被删除。我跟踪了它的功能结束,在那一端,它仍然有七个NSMutableArrays。

一旦它到达我的函数的末尾,我点击继续按钮,并在生成的按钮重新访问Events var的地方之前放置一个断点。在这个位置,事件是完全空的。

现在,为了简单起见,我没有做任何autorelase或保留命令。对于在viewDidLoad调用的几个方法之一中定义的变量,有一个释放命令。

任何人都可以告诉我如何阻止事件被卸载?谢谢你:)

2 个答案:

答案 0 :(得分:3)

听起来你正在做Events = [NSMutableArray array];之类的事情。这将创建一个自动释放的NSMutableArray实例,该实例将在函数返回后的某个时间自动处理。

相反,您可能希望Events = [[NSMutableArray alloc] init];创建一个非自动释放的实例,或Events = [[NSMutableArray array] retain];来保留自动释放的实例。无论哪种方式,系统都会知道您仍在使用该对象,因此不会将其丢弃。

答案 1 :(得分:1)

您没有发布您的代码,但我的猜测是您只是通过[NSMutableArray array]分配了数组,不是吗?好吧,在流程离开您创建数组的方法之后,数组会自动释放。为了防止这种情况,您只需要retain数组。