Objective-C内存泄漏



我只是在调查我的应用程序中的一些内存泄漏,我使用的是Xcode 4.0.2。我在Xcode中运行了Analyze工具,发现了一些内存泄漏。我对Objective-C还比较陌生,这是我的第一个应用程序。我把代码粘贴在这里:

http://pastie.org/3155043

我已经在上面的代码中添加了注释,其中出现了内存泄漏。

Memory Leak One:方法返回一个具有+1保留计数(拥有引用)的Objective-C对象。

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

内存泄漏三:在第246行分配并存储到"cmpWordoutStr"中的对象的潜在泄漏。

感谢您的帮助。

谨致问候,Stephen

您可能需要考虑在项目中使用自动引用计数。前几天我在这里问了一个问题,因为我不确定这是否是个好主意,但答案让我相信,这确实是向前迈出的一步,非常值得利用:

去ARC还是不去ARC?利弊是什么?

希望这有帮助:)

Leak 1)您没有显示返回或识别返回的变量,因此无法明确诊断此变量。

Leak 2)您分配/初始化一个NSString,并将其分配给一个从未释放的变量。这是错误的,有两个原因:

  1. 对于每个alloc,必须在某个地方有相应的发布
  2. 对空字符串执行alloc/init没有任何意义。如果您想要一个空字符串,只需使用@""

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

(你真的需要一本关于Objective-C编程的好书,学习并重新学习存储管理部分。否则你会在黑暗中跌跌撞撞。)

您首先分配了一个对象

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

然后在不释放内存的情况下重新分配指针:

cmpWorkoutStr = [cmpWorkoutStr stringByAppendingString:indWorkoutStr];

从而发生泄漏。

我没有深入分析您的代码,但我想您实际上想要NSMutableString

正如Tom Andersen在上面建议的那样,我使用了自动发布,这解决了问题,例如:

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

谨致问候,Stephen

最新更新