当我使用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泄漏...但对我来说代码是尊重内存管理...显然不是! 我做错了什么?
答案 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];