iPhone在紧密循环中泄漏内存

时间:2010-10-13 10:37:58

标签: iphone objective-c memory memory-leaks

我的内存素材出现问题,即使我已经在紧密循环中正确释放了对象,它也会不断增加。一段时间后应用程序将崩溃,出现“内存不足错误”... 我已经解决了这个问题:

/******************** Begin SimpleObject ***********/
//@interface SimpleObject : NSObject { 
//@public 
//    int iVarA, iVarB; 
//    int iVarC; 
//} 
//-(id) init; 
//-(void) dealloc; 
//@end 

//@implementation SimpleObject 
//- (id) init { return [super init]; } 
//- (void) dealloc { 
//    // NSLog ( @"SimpleObject dealloc" ); 
//    [super dealloc]; 
//} 
//@end 
/******************** End SimpleObject ***************/

NSAutoreleasePool *looppool = [[NSAutoreleasePool alloc] init];
for ( int i = 0; i < 1000; i++ ) {
    // This lead to the same problem
    // void *pVoid = malloc( 10000 );
    // free( pVoid );
    // End This lead to the same problem

 SimpleObject *obj = [[SimpleObject alloc] init];
 [obj release];
}
[looppool drain]; // whether or not I am using NSAutoreleasePool did not matter at all...

内存可能是碎片,但操作系统不应该处理这个问题吗?此外,分配之间没有任何内容......

任何想法都将受到高度赞赏。谢谢!

4 个答案:

答案 0 :(得分:3)

您是否,使用NSZombiedEnabled环境变量?这可以解释内存的累积,虽然它不能解释为什么你只使用malloc看到这个问题。

答案 1 :(得分:2)

问题在于SimpleObject的实现。请向我们展示init和dealloc方法的代码。

确保在SimpleObject的init方法中分配的所有内容都在其dealloc方法中释放。这适用于malloc和free的内容。

确保从SimpleObject的init方法返回self。


编辑:

我刚刚使用以下SimpleObject

声明编译并运行问题中发布的代码
@interface SimpleObject : NSObject
{
    char foo[10000];
}
@end

运行良好,没有泄漏。


编辑2:

刚刚看到有关此问题的评论是模拟器上的一个问题。我很容易相信模拟器泄漏了。在设备上试一试,看看代码是否仍然泄密。

答案 2 :(得分:0)

您正在处理SimpleObj的发布,对此毫无疑问。

这意味着问题必须在SimpleObj中,查看dealloc方法并确保释放其中的所有内容。

答案 3 :(得分:0)

我根据您问题中的界面创建了一个SimpleObject类,并运行了您粘贴的循环代码。没有崩溃。 Allocations和Leaks都将一切都列为正常工作。

你能发布SimpleObject的所有代码吗?这就是问题所在,所以我们需要完整地看待它才能提供帮助。