【发布时间】:2011-02-09 03:16:41
【问题描述】:
我有 UINavigationController 控制几个视图。其中一个视图由 20 个可滚动页面组成。每个页面都是通过添加按钮、标签、UIImageViews 等从 UIViews 动态构建的。当这个 UIView 从堆栈中弹出时,内存使用量保持不变。因此,如果我继续推动/弹出该视图,它会不断上升。
在我的 dealloc 中,我遍历所有 20 页并找到通过 addSubview 添加的每种类型的对象,然后对其进行释放,但仪器说我的内存使用量永远不会下降!我正在尝试使用“retainCount”来查看我正在释放的对象的情况,但我可能无法通过 retainCount 获得真实情况。对于某些元素,retainCount 显示为 2,因此我尝试释放该对象两次,但随后应用程序崩溃。如果我一旦它工作就释放它但内存使用量永远不会下降:(
Q1:我是否需要遍历找到每个元素,然后对该元素进行释放?为什么我不能释放一个父对象,它所包含的所有对象都会自动释放?
Q2:retainCount 是一个可靠的指标吗?
【问题讨论】:
-
进一步调试。这是我到目前为止发现的。我有一个 UIScrollView,我在其上添加了 20 个 UIViews 对象。同样的 20 个 UIView 被添加到 NSMutableArray。仪器告诉我,当视图弹出时,20 个 UIView 中的每一个都仍然悬而未决。好的,虽然我必须忘记从某个地方“释放”它,所以保留计数必须增加。我发现确实有一个地方。所以就在 [self.scrollView addObject:page] 行之后; //page 是我添加的 UIView [page release];但是现在在我释放 self.scrollView 应用程序崩溃时释放 NSMutableArray 之后。
-
在 NSZombieEnabled 之后,我看到了这个错误 *** -[CFString release]: message sent to deallocated instance 0x3ea6f00 Found NSStackLoggingNoCompact=1 将有助于以某种方式使用“info malloc”查看与崩溃中的地址关联的变量-history 0x3ea6f00' 执行此操作后,我看到一个堆栈跟踪,它指向我分配 NSMutableArray 的目标视图中的一行。我将此数组传递给正在弹出的视图。我想可能我只需要“保留”正在传递的数组,但这并没有帮助。应用程序继续崩溃并指向同一行。我从来没有被困得这么厉害:(