Iphone 试图跟踪cocos2D应用程序中的内存泄漏

Iphone 试图跟踪cocos2D应用程序中的内存泄漏,iphone,memory-management,memory-leaks,cocos2d-iphone,Iphone,Memory Management,Memory Leaks,Cocos2d Iphone,我正在努力追踪cocos2D游戏中的内存泄漏。我已经使用仪器运行了这个游戏,以找到导致泄漏的原因,大部分问题似乎都来自这个方法 -(void)setColour:(int)c { switch (c) { case RED: images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_small.png"]];

我正在努力追踪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];

仪器告诉我case语句中的行是内存泄漏的位置。此函数在对象生命周期中仅调用一次。你知道这会导致内存泄漏的原因吗?

当你创建纹理时,你是在分配它们,然后你会显式地保留它们。 尝试删除以下行:

[images[SMALL_BUBBLE_IMAGE] retain];
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain];
[images[LARGE_BUBBLE_IMAGE] retain];    
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain];

我已经尝试过了,这些行本来就不存在,它们只是在试图解决问题的过程中添加的。事实上,这就是问题所在。结果是,当我尝试它时,它实际上并没有在对象上被调用。一旦我移除了保留物,它就工作得很好。非常感谢。