1

게임의 어려운 부분을 코딩 한 후에 메모리 관리 버그를 발견했습니다.코드가 누출되거나 작동하거나 누출되거나 충돌하지 않습니다. 이것은 자동 해제 문제가 아닌 것 같습니다.

개체는 사용자 지정 클래스가있는 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 위치])에 액세스하려고합니다.

무엇이 잘못 되었나요?!

+0

addChild 및 removeChild에 대한 코드를 표시 할 수 있습니까? –

답변

1

해제 된 메모리를 참조하는 것처럼 들립니다. 실제로 메모리를 해제하면 프로그램 참조가 메모리를 해제했기 때문에 충돌이 발생합니다. autorelease를 사용하여 해제하지 않으면 메모리 누수가 있어도 시스템이이를 인식하지 못하기 때문에 객체가 실제로 해제되지 않아 참조가 문제가되지 않기 때문에 작동합니다.

그래서, 재미 :) 그냥 추측

+0

감사합니다. chipmunk 기능에서 문제가 발견되었습니다. – user162400

+1

다람쥐 기능? –

+0

Chipmunk는 OP가 사용하고있는 Cocos2d-iPhone과 함께 패키징 된 2D 물리 라이브러리입니다. – adurdin

0

개체를 종료하는 "removeChild"메서드에서 무언가를하고있을 가능성이 있습니까? 게시 한 코드에 문제가있는 것으로 보이지 않습니다 ...

+0

removeChild는 보유 수를 감소시키고 addChild는 보유 수를 증가시킵니다. 그게 문제가 되겠습니까? – user162400

+0

어떻게? 쇼 코드. 또한 객체 배열을 생성하는 코드를 보여줍니다. –

1

이 ... 돋보기를 꺼내 다시 코드를 통해보고, 디버거를 사용하기 시작 :

내가 생각 하는 AddChild은 유지됩니다 개체 및 removeChild 개체를 해제합니다.

하지만 removeChild이 개체를 찾지 못하는 경우 (즉, 자녀가 아닌 경우) 어떻게됩니까? 이 경우에도 객체가 해제됩니까? (하지 말아야 함)

0

첫 번째 함수에서 자동 해제해야합니다.이 함수는 초기화와 비슷한 함수이며 init을 호출합니다.

첫 번째 함수의 끝에서 개체를 유지 한 배열에 추가 했으므로 개체가 여전히 유효합니다.

첫 번째 함수가 호출되고 두 번째 함수가 호출되는 사이에 누군가가 그 개체를 릴리스하므로 개체에 액세스하는 것이 충돌하는 것입니다.

첫 번째 함수에 중단 점을 넣고 개체의 dealloc 및 두 번째 함수를 사용하여 두 번째 호출 전에 누가 해제하는지 확인합니다.