在for循环中使用NSString时内存泄漏

时间:2012-01-27 13:10:34

标签: iphone objective-c

我的资源包中有100个图像,名为image1.jpg,image2.jpg。 基本上我要做的是在for循环中动态创建这些图像的路径名 在模拟器中测试时,图像加载正常,应用程序没有崩溃。但在使用仪器测试应用程序时,我惊讶地看到在创建path1对象时发生的大量内存泄漏。

     I am pasting  the entire method here for reference

- (id)init {
self = [super init];
if (self) {             

    self.arrayImages = [[[NSMutableArray alloc] init] autorelease];      

    for(int i=1 ; i<100 ; i++){            

        NSString *str = [NSString stringWithFormat:@"Century%d",i];
        NSString *path1 = [[NSBundle mainBundle] pathForResource:str ofType:@"jpg"];            
        [self.arrayImages addObject:path1];        
    }                        
}
return self;

}

由于我没有在循环中使用任何alloc,我没有任何所有权,因此没有权利释放该对象。这个内存泄漏的原因是什么?

请解释问题并提供必要的解决方案以便解决问题。

与往常一样,任何帮助都受到高度赞赏..

3 个答案:

答案 0 :(得分:3)

arrayImages正在保留path1,因此如果您不释放arrayImages,它就会泄漏。你是如何创建arrayImages的,并且是否在任何地方发布它?

根据评论编辑:

确保您在arrayImages方法中发布-dealloc,如下所示:[arrayImages release];(请注意缺少self)。

答案 1 :(得分:2)

您显示的代码中没有泄漏。

有(至少)两种可能性:

  1. 您没有粘贴到问题中的代码泄漏
  2. 一切都很好,乐器给你一个假阳性
  3. 你的循环创建许多自动释放的变量。直到循环结束后才会释放这些内容,但这就是它应该如何工作。

答案 2 :(得分:-1)

泄漏的原因就在这一行:

NSString *str = [NSString stringWithFormat:@"Century%d",i];

通过在Objective-C中使用便捷方法,后台会发生以下情况:

NSString *str = [[[NSString alloc] initWithFormat:@"Century%d", i] autorelease];

不使用alloc / init来创建弱引用是一种误解。无论您如何创建对象,您始终是已创建对象的所有者。方便的方法只是为您执行alloc / init和自动释放。

我建议你这样做以避免泄漏记忆:

- (id)init {
    self = [super init];
    if (self) {             

        self.arrayImages = [[[NSMutableArray alloc] init] autorelease];

        NSAutoreleasePool *tmpPool = [[NSAutoreleasePool alloc] init];

        for(int i = 1 ; i < 100 ; i++) {

            NSString *str = [NSString stringWithFormat:@"Century%d",i];
            NSString *path1 = [[NSString alloc] initWithString:[[NSBundle mainBundle] pathForResource:str ofType:@"jpg"]];
            [self.arrayImages addObject:path1];
            [path1 release];
        }

        [tmpPool drain];
    }
    return self;
}

请告诉我这是否适合您。

-EDIT-在添加到arrayImages后分配path1对象并释放它。