2012-01-09 88 views
0

我只是在调查一些内存泄漏,我使用的是Xcode 4.0.2。我已经在Xcode中运行了分析工具,并且已经确定了很少的内存泄漏。我对Objective-C比较陌生,这是我的第一个应用程序。我在这里粘贴代码:Objective-C内存泄漏

http://pastie.org/3155043

我添加注释上面的代码,其中的内存泄漏存在的。

内存泄漏一:方法返回带有+1保留计数(拥有引用)的Objective-C对象。

内存泄漏二:在第248行分配并存储在'imagesNames'中的对象未在此执行路径中引用,并且保留计数为+1(对象泄露)。

内存泄漏三:在线246上分配并存储到'cmpWordoutStr'中的对象的潜在泄漏。

任何帮助表示赞赏。

问候, 斯蒂芬

回答

0

当汤姆安德森以上建议我用自动释放,这解决了这个问题,下面的例子:

NSString *cmpWorkoutStr = [[[NSString alloc] init] autorelease]; 
NSString *imageNames = [[[NSString alloc] init] autorelease]; 

问候, 斯蒂芬

1

你可能要考虑使用自动引用在您的项目计数。 我问一个问题有一天就到这里,因为我不知道,这是个好主意,但答案使我确信,它确实是一个进步,是非常值得趁着:

To ARC or not to ARC? What are the pros and cons?

希望这有助于:)

+0

如果你不为iOS开发,忽略了这个答案..我最后的咖啡一定已经磨损了。 – 2012-01-09 16:48:06

1

泄漏1)你不显示返回或确定哪个变量返回,所以不可能明确诊断这一个。

泄漏2)您分配/ init一个NSString并将其分配给一个永远不会释放的变量。这是错误的,原因有两个:

  1. 对于每个alloc,必须有相应的版本。
  2. 对空字符串进行alloc/init没有意义。如果你想要一个空字符串,只需使用@""

泄漏3)基本上与(2)相同。

(你真的需要得到的Objective-C编程的一本好书,学习和再论存储管理的部分。否则,你就可以在黑暗中跌跌撞撞左右)

1

你分配一个对象第一

NSString *cmpWorkoutStr = [[NSString alloc] init]; 

,并重新分配指针而不释放所述存储器:

cmpWorkoutStr = [cmpWorkoutStr stringByAppendingString:indWorkoutStr]; 

因此泄漏。

我没有深入分析你的代码,但我想你实际上需要NSMutableString那里。

+0

可变字符串通常是一个坏主意,除非性能受到影响。 NSString * cmpWorkoutStr = @“”或NSString * cmpWorkoutStr = [[[NSString alloc] init] autorelease];基本上是相同的,你需要其中的一个。 – 2012-01-09 20:51:44