Мой код либо утекает и работает, либо не утекает и вылетает. Это не похоже на проблему с автоматическим выпуском - PullRequest
1 голос
/ 15 сентября 2009

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

objects - это NSMutableArray, содержащий пользовательский класс.

- (void) spawnObjects
{   
    for (int index = 0; index < INITIAL_OBJECTS; index++)
    {
        [objects addObject:[[[MatchObject alloc] initWithImageNameID:(index % 3)] autorelease]];
        [[objects objectAtIndex:index] setPosition:[GameLayer randomPoint]];
    }

    ...
}

Позже я использую эту функцию.

- (void) checkAllSprites
{

    NSMutableArray *spritesToDelete = [NSMutableArray array];
    for (int index = 0; index < [points count] - 1; index ++)
    {
        for (MatchObject *planetLike in objects)
        {
            CGPoint point1 = [[points objectAtIndex:index] CGPointValue];
            CGPoint point2 = [[points objectAtIndex:index+1] CGPointValue];
            if ([GameLayer lineIntersectsCircle:point1 :point2 :[planetLike position] :16.0f])
            {

                ParticleSystem *planetDeath = [ParticlePlanetDeath node];
                planetDeath.texture = [[TextureMgr sharedTextureMgr] addImage:@"fire.pvr"];
                planetDeath.position = [planetLike position];
                [self addChild:planetDeath z:0 tag:2];

                [spritesToDelete addObject:planetLike];

                [self removeChild:planetLike cleanup:YES];

            }

        }
    }
    [objects removeObjectsInArray:spritesToDelete];
    [spritesToDelete removeAllObjects];

}

Если я не делаю авто-релиз в первой функции, приложение работает нормально. Если я это сделаю, то я пытаюсь получить доступ к освобожденному объекту ([MatchObject position]).

Что не так?!

Ответы [ 4 ]

1 голос
/ 15 сентября 2009

Похоже, вы ссылаетесь на освобожденную память. Когда вы действительно освобождаете память, она падает, потому что ваша программа освобождает память. Когда вы не освобождаете его с помощью автоматического выпуска, он все равно работает, потому что, несмотря на утечку памяти, система не замечает этого, поскольку объект фактически не освобожден, поэтому ссылка на него не вызывает проблем. *

Итак, вытащите увеличительное стекло, снова посмотрите код и начните использовать отладчик ... получайте удовольствие :) 1003 *

1 голос
/ 15 сентября 2009

Просто дикое предположение:

Полагаю, addChild сохраняет объект, а removeChild освобождает объект.

Но что происходит, когда removeChild не находит объект (т. Е. Если это не ребенок)? Это освобождает объект тоже в этом случае? (чего не должно быть)

0 голосов
/ 04 марта 2013

Вы должны выполнить автоматический выпуск первой функции, так как она не похожа на init-функцию и вы вызываете init.

В конце первой функции объект все еще действителен, поскольку вы добавили его в массив, который вызвал сохранение.

Между первой вызываемой функцией и второй вызываемой функцией кто-то освобождает объект, поэтому доступ к объекту дает сбой.

Поместите точку останова в первую функцию, в освобождение объекта и вторую функцию, чтобы увидеть, кто освобождает ее перед вторым вызовом.

0 голосов
/ 15 сентября 2009

Есть ли вероятность, что вы что-то делаете в методе "removeChild", который в конечном итоге освобождает объект? Похоже, что с кодом, который вы разместили, что-то не так ...

...