Сбой в авто-выпуске (cocos2d) - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть класс TileMap.При инициализации я загружаю уровень в память и считываю ширину и высоту.Но когда я вызываю этот класс с помощью автоматического выпуска -> программа вылетает

в .h

#import "cocos2d.h"

@interface TileMap : NSObject
{
    CCTMXTiledMap *_tileMap;
    float _width, _height;
}

@property (nonatomic, retain) CCTMXTiledMap *tileMap;
@property (readwrite) float width;
@property (readwrite) float height;

-(void) loadMapWithLVL : (NSString *)lvl;
@end

в .m

#import "TileMap.h"

@implementation TileMap

@synthesize tileMap = _tileMap;
@synthesize width = _width;
@synthesize height = _height;

- (void) dealloc
{
    //[_tileMap release];
    self.tileMap = nil;
    [super dealloc];
}

-(void) loadMapWithLVL: (NSString *)lvl
{
    [self.tileMap release];
    NSString *lvl_new = [NSString stringWithFormat:@"%@.tmx",lvl];

    CCLOG(@"Reload TileMap to %@", lvl_new);
    self.tileMap = [[CCTMXTiledMap tiledMapWithTMXFile:lvl_new] retain];
    self.width = _tileMap.mapSize.width;
    self.height = _tileMap.mapSize.height;    
}

- (id)init
{
    self = [super init];
    if (self) {
        CCLOG(@"Init TileMap");
        self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"1lvl.tmx"];
        self.width = _tileMap.mapSize.width;
        self.height = _tileMap.mapSize.height;
        CCLOG(@"size map in init %0.2f %0.2f", _width, _height);

    }        
    return self;
}    
@end

в другом классе, когда я пишу:1009 *

    TileMap *testmap = [[[TileMap alloc] init] autorelease];
    float testg = testmap.width;
    CCLOG(@"size map %0.2f", testg);

У меня сбой.Но когда я пишу:

TileMap *testmap = [[TileMap alloc] init];
float testg = testmap.width;
CCLOG(@"size map %0.2f", testg);
[testmap release]

у меня не вылетает.Почему это происходит?

1 Ответ

1 голос
/ 16 ноября 2011

В вашем коде есть несколько ошибок.Сначала вы объявили свойство как 'retain' - @property (nonatomic, retain) CCTMXTiledMap *tileMap; и также 'синтезировали' его.Это означает, что теперь вы можете работать с этим свойством без какого-либо ключевого слова release / retain.Поэтому перепишите метод loadMapWithLVL следующим образом:

-(void) loadMapWithLVL: (NSString *)lvl{
    NSString *lvl_new = [NSString stringWithFormat:@"%@.tmx",lvl];

    CCLOG(@"Reload TileMap to %@", lvl_new);
    self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:lvl_new];
    self.width = _tileMap.mapSize.width;
    self.height = _tileMap.mapSize.height;    
}

Еще одна вещь - не вызывайте метод self. в dealloc при очистке свойств.[_tileMap release];, _titleMap = nil; - правильный подход к очистке памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...