0

我在我的 cocos2d iPhone 项目中启用了 ARC。现在我面临一个问题,即某些当前在屏幕上或屏幕外不可见的元素。我想在运行时释放这些元素占用的内存。因为我在我的项目中实现了 ARC,它将在编译时释放该内存。但我认为我应该在运行时释放该内存以进行内存优化。为了演示,我使用 4 个平铺地图对象实现了无限平铺地图。文件如下所示。

HelloWorldLayer.h

#import "cocos2d.h"
#import "Box2D.h"
#import "GLES-Render.h"
#define PTM_RATIO 32
@interface HelloWorldLayer : CCLayer
{
    CCTMXTiledMap *map1;
    CCTMXTiledMap *map2;
    CCTMXTiledMap *map3;
    CCTMXTiledMap *map4;
    CCTMXTiledMap *defaultMap;
    float mapToBeAdded;
    int whichMap;
    CGSize screenSize;
    int speed;
    BOOL complexMap;
    CCMenu *menu;
}
+(CCScene *) scene;
@end

HelloworldLayer.mm

#import "HelloWorldLayer.h"
#import "AppDelegate.h"
#import "PhysicsSprite.h"

@implementation HelloWorldLayer

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];
    HelloWorldLayer *layer = [HelloWorldLayer node];
    [scene addChild: layer];
    return scene;
}

-(id) init
{
    if( (self=[super init])) {
        screenSize = [[CCDirector sharedDirector] winSize];
        defaultMap = [CCTMXTiledMap tiledMapWithTMXFile:@"bgdefaultmap.tmx"];

        defaultMap.position = ccp(0, screenSize.height-defaultMap.mapSize.height*defaultMap.tileSize.height);
        [self addChild:defaultMap];
        map1=[CCTMXTiledMap tiledMapWithTMXFile:@"bgmap11.tmx"];
        map1.position = ccp(0, defaultMap.position.y-map1.mapSize.height*map1.tileSize.height);
        [self addChild:map1];
        mapToBeAdded = map1.position.y + (map1.mapSize.height*map1.tileSize.height)/4;
        whichMap = 2;
        speed = 3;
        complexMap=NO;
        [self schedule:@selector(update:)];
        CCMenuItemFont * button = [CCMenuItemFont itemWithString:@"MENU" target:self selector:@selector(onMenuButton)];
        menu = [CCMenu menuWithItems:button, nil];
        menu.position=ccp(screenSize.width/2, screenSize.height/2);
        [self addChild:menu z:10];

    }
    return self;
}
-(void)onMenuButton{
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

    [CCAnimationCache purgeSharedAnimationCache];
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
    [[CCDirector sharedDirector] purgeCachedData];
    [[CCTextureCache sharedTextureCache] removeAllTextures];

    [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[HelloWorldLayer scene] withColor:ccWHITE]];
}
-(void)update:(ccTime)dt{
    if(-1*self.position.y<mapToBeAdded){
        if(!complexMap){
            if(whichMap==2){

                [self removeChild:defaultMap cleanup:YES];
                map2 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap22.tmx"];
                map2.position=ccp(0, map1.position.y-map2.mapSize.height*map2.tileSize.height);
                whichMap =3;
                mapToBeAdded = map2.position.y + (map2.mapSize.height*map2.tileSize.height)/4;
                [self addChild:map2];

            }else if(whichMap==3){
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background1.png"];
                [self removeChild:map1 cleanup:YES];
                map3 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap33.tmx"];
                map3.position=ccp(0, map2.position.y-map3.mapSize.height*map3.tileSize.height);
                [self addChild:map3];
                whichMap =4;
                mapToBeAdded = map3.position.y + (map3.mapSize.height*map3.tileSize.height)/4;
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background1.png"];
            }else if(whichMap==4){
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background2.png"];
                [self removeChild:map2 cleanup:YES];
                map4 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap44.tmx"];
                map4.position=ccp(0, map3.position.y-map4.mapSize.height*map4.tileSize.height);
                [self addChild:map4];
                complexMap=YES;
                whichMap =1;
                mapToBeAdded = map4.position.y + (map4.mapSize.height*map4.tileSize.height)/4;
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background2.png"];
            }
        }else{
            if(whichMap==1){
                [self removeChild:map3 cleanup:YES];
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background3.png"];
                map1 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap1.tmx"];
                map1.position=ccp(0, map4.position.y-map1.mapSize.height*map1.tileSize.height);
                [self addChild:map1];
                whichMap =2;
                mapToBeAdded = map1.position.y + (map1.mapSize.height*map1.tileSize.height)/4;

            }else if(whichMap==2){
                [self removeChild:map4 cleanup:YES];
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background4.png"];
                map2 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap2.tmx"];
                map2.position=ccp(0, map1.position.y-map2.mapSize.height*map2.tileSize.height);
                [self addChild:map2];
                whichMap =3;
                mapToBeAdded = map2.position.y + (map2.mapSize.height*map2.tileSize.height)/4;

            }else if(whichMap==3){
                [self removeChild:map1 cleanup:YES];
                [[CCTextureCache sharedTextureCache] removeTextureForKey:@"background1.png"];
                map3 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap3.tmx"];
                map3.position=ccp(0, map2.position.y-map3.mapSize.height*map3.tileSize.height);
                [self addChild:map3];
                whichMap =4;
                mapToBeAdded = map3.position.y + (map3.mapSize.height*map3.tileSize.height)/4;

            }else if(whichMap==4){
                [self removeChild:map2 cleanup:YES];

                map4 = [CCTMXTiledMap tiledMapWithTMXFile:@"bgmap4.tmx"];
                map4.position=ccp(0, map3.position.y-map4.mapSize.height*map4.tileSize.height);
                [self addChild:map4];
                complexMap=YES;
                whichMap =1;
                mapToBeAdded = map4.position.y + (map4.mapSize.height*map4.tileSize.height)/4;

            }
        }
        [CCAnimationCache purgeSharedAnimationCache];
        [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
        [[CCDirector sharedDirector] purgeCachedData];
        [[CCTextureCache sharedTextureCache] removeUnusedTextures];
    }

    float y = self.position.y;
    y = y+speed;
    self.position =ccp(self.position.x, y);
    menu.position = ccp(menu.position.x, menu.position.y-speed);
    printf("%d\n",[[self children] count]);
}
@end

所以我想知道是否可以在运行时释放内存?我应该怎么办?任何形式的帮助或指导都会有所帮助。

4

1 回答 1

0

在 ARC 下,要释放由强引用持有的对象,您必须将所有对它的引用都归零。

于 2013-07-17T13:49:15.467 回答