我正在试图追踪我的cocos2D游戏中的一个内存泄漏。我已经使用工具运行了游戏,以找出导致泄漏的原因,而大部分问题似乎都来自于这种方法。
-(void)setColour:(int)c {
switch (c) {
case RED:
images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_small.png"]];
images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_select_small.png"]];
images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble.png"]];
images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_select.png"]];
break;
case BLUE:
images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_small.png"]];
images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_select_small.png"]];
images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble.png"]];
images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_select.png"]];
break;
case GREEN:
images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_small.png"]];
images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_select_small.png"]];
images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble.png"]];
images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_select.png"]];
break;
case PURPLE:
images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_small.png"]];
images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_select_small.png"]];
images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble.png"]];
images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_select.png"]];
break;
case YELLOW:
images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_small.png"]];
images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_select_small.png"]];
images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble.png"]];
images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_select.png"]];
break;
}
[images[SMALL_BUBBLE_IMAGE] retain];
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain];
[images[LARGE_BUBBLE_IMAGE] retain];
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain];
[small_bubble setTexture:images[SMALL_BUBBLE_IMAGE]];
[large_bubble setTexture:images[LARGE_BUBBLE_IMAGE]];
colour = c;
}这个函数所做的就是改变一个对象使用的图像,每个对象都有4个相关的图像,所以我将它们存储在一个数组中。我曾认为我使用的任何未保留的指针都会自动释放,但后来我发现情况并非如此。如果我在对象上调用release而没有先在对象上调用retain,那么这个项目就会崩溃,这就是为什么会有保留图像的行存在的原因。
我在dealloc函数中调用这些行;
[images[SMALL_BUBBLE_IMAGE] release];
[images[SMALL_SELECTED_BUBBLE_IMAGE] release];
[images[LARGE_BUBBLE_IMAGE] release];
[images[LARGE_SELECTED_BUBBLE_IMAGE] release];Instruments告诉我case语句中的行是内存泄漏的地方。此函数在对象生命周期中只调用一次。你知道为什么这会导致内存泄漏吗?
发布于 2010-08-23 17:47:00
当您创建纹理时,您正在分配它们,然后您将显式地保留它们。尝试删除这些行:
[images[SMALL_BUBBLE_IMAGE] retain];
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain];
[images[LARGE_BUBBLE_IMAGE] retain];
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain];https://stackoverflow.com/questions/3545281
复制相似问题