了解iOS仪器

时间:2011-05-11 23:10:56

标签: iphone memory-management instruments

我正在创建一个iPhone应用程序。遇到内存问题我开始使用Instruments来追踪任何内存问题。我遇到了一些奇怪的行为,导致我误以为我误用了仪器或误读了它的数据。

这些是移入和移出某个位置时记录的LiveBytes值:

**Expensive Location-**
World (12 MB)
Loc (27 MB)
World (13 MB )
Loc (28 MB)
World (14 MB)
-Crash

**Cheap Location-**
World (12 MB)
Loc (23 MB)
World (13 MB )
Loc (24 MB)
World (14 MB)
-Crash

请注意,即使廉价位置的内存不在昂贵的位置内存附近,我仍然会崩溃。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我不确定这是否与您遇到的问题有关,但我希望它有所帮助:我最近跟踪应用程序的内存占用情况,我注意到即使dealloc消息被发送到视图控制器之后在UINavigator控制器上“回”,我仍然有几十个活动对象从这个操作中留下(你可以在仪器应用程序的'Allocations'面板中看到这个)。为了解决这个问题,我使用了一些东西:

首先,我将以下三种方法添加到NSLog我的自定义子视图的保留计数器(在iOS4 - fast context switching的SO上找到):

#pragma mark - RETAIN DEBUG MAGIC
// -----------------------------------------------------------------------------

- (id)retain
{
  NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
  return [super retain];
}
- (void)release
{
  NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
  [super release];
}
- (id)autorelease
{
  NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
  return [super autorelease];
}

然后,我隔离了每个视图构建块,只留下一个简单的任务(例如将UIButton作为子视图加载)并返回到仪器应用程序以跟踪活动对象(在产品> Xcode中的配置文件下)并使用“NS”,“CF”和“Malloc”前缀禁用所有对象(您可以单击“分配”选项卡旁边的小 i 按钮)。在此之后,在右下方窗格中选择“调用树”并继续钻孔,直到我找到一些物体计数器上升的位置,因为我来回导航。

请注意,您可以双击该符号以查看与对处理器进行的调用相关的详细信息。此外,单击小 i 图标将弹出一个突出显示的呼叫的回溯。

在查看回溯时,您会看到其中一些有一个小图标,描绘一个人在一个框架上(这些图标旁边的文字作为视觉提示明显更暗)。双击这些将带您到代码中负责此次调用的行。

以下几个链接可以帮助您了解有关乐器的更多信息:

注意:的 在我的旅程结束时,我所要做的就是在将它们添加到“超级”视图中之后发布我的观点,以确保它们被释放。即,

[[self view] addSubView:aButton];
[aButton release];