2010-07-29 127 views
2

我正在潜入iOS开发领域并逐渐熟悉这些工具。在每天结束时,我会在我的应用程序中执行“使用乐器工具运行 - >泄漏”来检查当天可能实施的任何内存泄漏。它很少似乎检测到任何泄漏,虽然我想我只是一个自然的iOS程序员,我拒绝相信;)为什么仪器“泄漏”模板在我的iOS应用程序中发现我的内存泄漏?

无论如何,我只是发现我认为是我的内存泄漏代码,它不会被仪器捕获。我有这行代码...

gkSession = [[GKSession alloc] initWithSessionID:@"testID" displayName:@"Temp Display Name" sessionMode:GKSessionModeClient]; 

,我发现,我并没有在我的代码调用release任何地方。我的问题是...

  1. 这是内存泄漏吗?
  2. 如果是这样,仪器可能无法捕捉它的原因是什么?

我明显的担心是我的代码中有内存泄漏,而Instruments没有捕获它们。

非常感谢您的帮助!

+0

什么是gkSession(财产?ivar?)在你的应用程序中gkSession“超出范围”的地方有一点吗?当我开始时,我发现静态分析仪是超级有用的。 http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html – Steve 2010-07-29 18:25:08

+0

谢谢,史蒂夫,我会检查出静态分析器。是的,这是一个视图控制器的ivar,被推到导航堆栈上。 – BeachRunnerFred 2010-07-29 18:27:02

+0

啊!然后我可以提出一个答案! :) – Steve 2010-07-29 18:28:52

回答

6

有多种类型的动态分配内存。

  1. 存储器的引用计数大于零,它仍然被引用并正在使用中。

  2. 存储器的引用计数为 为零,它仍被引用并仍在使用中。

  3. 引用计数大于零的引用未被引用的内存。

  4. 存储器引用计数为零,未引用。

  5. 内存引用计数为 大于零,它仍然被引用并且未被使用。

第一类是正常使用的内存。第二种类型是一个错误,当您尝试关注该参考资料时,该错误将被报告为非法访问。类型3是仪器检测到的泄漏类型。内存系统应该释放类型4。

类型5是仪器无法检测到的泄漏,也不会被完整的垃圾回收器处理。这是你似乎拥有的。

编辑:

我忘型6 - 内存使用引用计数不符合实际的引用数。这可能最终会变成类型2或4.

+0

谢谢,达朗!你有没有找到第5类泄漏的方法? – BeachRunnerFred 2010-07-29 18:47:09

+0

在Java世界中有很多工具可以帮助您找到这些工具,但我不熟悉iOS中的任何工具。这并不意味着他们不存在,我不熟悉那里的工具。 – Darron 2010-07-29 18:49:16

2

#1的答案是“可能”...如果您的视图控制器从堆栈中弹出,并且没有其他人保留它,那么您的视图控制器应该得到释放。但是(这可能是你问题#2的答案)我最初犯的一个错误并不了解当你调用pushViewController时:导航控制器将保留你的视图控制器,所以你不必这样做。确保在创建视图控制器并将其推入堆栈后释放视图控制器。

​​

我相信静态分析器会警告你,如果你忘了在这种情况下释放呼叫......这是一个原因静态分析是如此之大。

如果你不是在这一点上释放视图控制器,你的保留计数将总是比它应该高+1。

我注意到静态分析仪对于这些东西比仪器的泄漏工具更有用。 (例如,其中不会找到包含循环引用的“泄漏”......引用自身的两个泄漏对象不会显示,因为“引用”仍在您的对象周围)。

所以目前你的线沿线的东西...

@interface MyClass : UIViewController 
{ 
    GKSession * gkSession; 
} 

... 

@end
在您的实现

你应该确保你释放你的伊娃在你的dealloc方法:

@implementation MyClass 

... 

- (void)dealloc 
{ 
    [super dealloc]; 

    if (gkSession) [gkSession release]; 
} 
@end 
+0

谢谢,史蒂夫,我似乎遵循上面指定的所有约定,所以我不知道还有什么要尝试。 – BeachRunnerFred 2010-07-29 18:53:08

+0

是否在您将视图从堆栈弹出时为您的视图控制器调用dealloc? – Steve 2010-07-29 18:56:00

+0

是的,它的确如此。真奇怪。 – BeachRunnerFred 2010-07-29 19:00:22