首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试跟踪cocos2D应用程序中的内存泄漏

尝试跟踪cocos2D应用程序中的内存泄漏
EN

Stack Overflow用户
提问于 2010-08-23 14:51:38
回答 1查看 735关注 0票数 0

我正在试图追踪我的cocos2D游戏中的一个内存泄漏。我已经使用工具运行了游戏,以找出导致泄漏的原因,而大部分问题似乎都来自于这种方法。

代码语言:javascript
复制
-(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函数中调用这些行;

代码语言:javascript
复制
    [images[SMALL_BUBBLE_IMAGE] release];
[images[SMALL_SELECTED_BUBBLE_IMAGE] release];
[images[LARGE_BUBBLE_IMAGE] release];   
[images[LARGE_SELECTED_BUBBLE_IMAGE] release];

Instruments告诉我case语句中的行是内存泄漏的地方。此函数在对象生命周期中只调用一次。你知道为什么这会导致内存泄漏吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-23 17:47:00

当您创建纹理时,您正在分配它们,然后您将显式地保留它们。尝试删除这些行:

代码语言:javascript
复制
[images[SMALL_BUBBLE_IMAGE] retain];
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain];
[images[LARGE_BUBBLE_IMAGE] retain];    
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3545281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档