即使在正确的位置发布NSString泄漏(我猜)?

时间:2010-09-21 17:19:55

标签: iphone memory-leaks nsstring

当我使用Instruments分析以下代码时,它会报告变量 imageName 的泄漏:

//loadImagesFromPotatoesIndexesArray
-(void) loadImagesFromPotatoesIndexesArray{

    //Load Textures from Disk
    textures = [[NSMutableArray alloc] init];
    //NSArray *masks = [[NSArray alloc] initWithArray:mainDelegate.masksArray];

    for (int i = 0;i<[potatoesIndexesArray count];i++){ 

        int imageNumber = [[potatoesIndexesArray objectAtIndex:i]intValue];

        NSString *imageName = [[NSString alloc] initWithFormat:@"texture%d",imageNumber];

        UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];

        NSArray *pics = [[NSArray alloc] initWithObjects:
                         [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                         [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                         imageName, 
                         nil]; 

        [textures addObject:pics];

        [image release];
        [imageName release];
        [pics release];
    }
}

[potatoesIndexesArray计数] = 16,所以我有16次NSCFString泄漏...但对我来说代码是尊重内存管理...显然不是! 我做错了什么?

4 个答案:

答案 0 :(得分:3)

你永远不会释放'textures'数组。它仍然掌握着一切。

答案 1 :(得分:1)

代码中调用loadImagesFromPotatoesIndexesArray的频率是多少?如果多次调用,原始数组中的所有值都将被泄露,因为在用新数组替换它之前没有正确释放textures

如果 被多次调用,这应该可以解决问题:

// load textures from disk
[textures removeAllObjects];
//NSArray *masks = [[NSArray ...

for (int i=0; ...

答案 2 :(得分:0)

如果认为当你在pics数组中添加imageName时它会保留它;-) (我认为它回答了你的问题)

但是,你为什么要在这里做分配? 为什么不做类似的事情

[ NSString stringWithFormat:@"" ]

祝你好运!

答案 3 :(得分:0)

这是一个复杂的问题。您分配imageName,因此retainCount为1,然后将其添加到数组中,保留计数为2,当您释放imageName时,retain Count再次为1。然后如果你还发布了pics数组,一切都会好的。但是你的pics数组被添加到纹理中,然后pics被释放,所以你的照片retainCount仍然是1.你的imageName被泄露了。但是,如果您释放textures数组,一切都会没问题

    NSString *imageName = [[NSString alloc] initWithFormat:@"texture%d",imageNumber];

   NSArray *pics = [[NSArray alloc] initWithObjects:
                     [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                     [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                     imageName, 
                     nil]; 

    [imageName release];