내 코드는 누출되고 작동하거나 누출 및 충돌하지 않습니다. 이것은 자동 제출 문제처럼 보이지 않습니다

StackOverflow https://stackoverflow.com/questions/1423698

문제

게임의 어려운 부분을 코딩 한 후 메모리 관리 버그를 찾았습니다.

객체는 사용자 정의 클래스를 보유한 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])에 액세스하려고합니다.

뭐가 문제 야?!

도움이 되었습니까?

해결책

해방 된 메모리를 참조하는 것처럼 들립니다. 실제로 메모리를 해제하면 프로그램이 해제 된 메모리를 참조하여 충돌합니다. AutoreLease를 사용하여 해제하지 않으면 STIL은 메모리 누출이 있더라도 시스템이 실제로 해제되지 않기 때문에 시스템이 표시되지 않기 때문에 시스템이 표시되지 않기 때문에 작동합니다.

따라서 돋보기를 꺼내 코드를 다시 살펴보고 디버거를 사용해보십시오 ... 재미있게 보내십시오 :)

다른 팁

그냥 거친 추측 :

나는 생각한다 addChild 물체를 유지하고 있습니다 제거 개체를 출시하고 있습니다.

그러나 언제 일어날 지 제거 대상을 찾지 못합니다 (즉, 아이가 아닌 경우)? 이 경우에도 객체를 해제합니까? (하지 말아야 할 것)

"removechild"메소드에서 객체를 방출하는 일을 할 가능성이 있습니까? 게시 한 코드에는 아무 문제가없는 것 같습니다 ...

첫 번째 함수에서는 비 인치와 같은 함수이므로 init를 호출하기 때문에 첫 번째 함수에서 자동 제출해야합니다.

첫 번째 함수의 끝에서 객체는 여전히 유효합니다. 배열에 추가하여 유지를 일으키기 때문에 객체는 여전히 유효합니다.

호출되는 첫 번째 함수와 두 번째 기능 사이에서 누군가가 객체를 공개하는 것이므로 객체에 액세스하는 것이 충돌하는 것입니다.

첫 번째 함수, 객체의 거래 및 두 번째 함수에 중단 점을 넣어 두 번째 호출 전에 누가 공개하는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top