Почему у меня проблемы с памятью? - PullRequest
2 голосов
/ 02 апреля 2010

Я получил эту ошибку от XCode:

objc[8422]: FREED(id): message release sent to freed object=0x3b120c0

Я гуглил и обнаружил, что связано с памятью. Но я не знаю, в какой строке кода я ошибаюсь, есть идеи? После того, как я запустил мое приложение в симуляторе, оно запрашивает секунду, кроме того, никакой другой ошибки, кроме указанной выше ошибки.

@implementation MyAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    [self changeScene:[MainGameMenuScene class]];
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}

- (void) changeScene: (Class) scene
{
    BOOL animateTransition = true;

    if(animateTransition){
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line.
    }

    if( viewController.view != nil ) {
        [viewController.view removeFromSuperview]; //remove view from window's subviews.
        [viewController.view release]; //release gamestate 
    }

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self];

        //now set our view as visible
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    if(animateTransition){
        [UIView commitAnimations];  
    }   
}

Ответы [ 3 ]

3 голосов
/ 02 апреля 2010
[viewController.view release]; //release gamestate

Это дополнительный релиз (если вы его не распределили, не выпускайте его). Пара строк вниз:

viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

снова выпустит viewController.view перед сохранением нового значения, что перезапустит представление и вызовет сбой (оно отправляет сообщение об освобождении объекту, который уже был освобожден / память уже освобождена) , Вместо этого попробуйте:

scene *view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self];
viewController.view = view; // setView will release the old/retain the new
[view release];             // so you don't need to worry about releasing it later
0 голосов
/ 02 апреля 2010

Эта строка:

[viewController.view release];

Скорее всего, ваша проблема. Никогда не отправляйте release в свойство объекта, кроме как в методе dealloc класса. Контроллеры представления view accessors будут обрабатывать сохранение и освобождение для вас.

0 голосов
/ 02 апреля 2010

Получил решение:

- (void) changeScene: (Class) scene
{
    BOOL animateTransition = true;

    if(animateTransition){
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line.
    }

    if( viewController.view != nil ) {
        [viewController.view retain]; //retain the view.
        [viewController.view removeFromSuperview]; //remove view from window's subviews.
        [viewController.view release]; //release gamestate 
    }

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self];

        //now set our view as visible
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    if(animateTransition){
        [UIView commitAnimations];  
    }   
}

Мне нужно, чтобы сохранить представление, но я не знаю, почему это необходимо.

...