2009-09-03 2 views
1

를이 내 '틱'함수 객체 :할당 해제있는 NSMutableArray는

- (void) tick: (ccTime) dt 
{ 

NSLog(@"%d",ticker); 
if(fbut.Adown == YES && ticker > 4)//fbut is a button 
{ 


    elayer = [[effectsLayer alloc] init]; // each effectlayer draws a //projectile that moves forward 'x' ticks 

    elayer.e_playpos = glayer.playerpos; // player position 
    [self addChild:elayer z:2]; 

    [mutable addObject: elayer]; 
[elayer release]; 

    if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one. 
    { 
    NSLog(@"mutable: %d", mutable.count); 

    [mutable removeLastObject]; 
    } 

    ticker=0; 
} 
ticker++; 


// . . . 

이이

http://screencast.com/t/LpNHL2kJIVpu

20 개 이상의처럼 보이는

처럼 실행중인 프로그램은 모습입니다 ..

흥미를 그래도 어레이는 20 개의 물체를 안정적으로 잡고 있습니다. 그래서 객체가 ([mutable removeLastObject];를 통해) '제거'되면 어떻게 화면에 나타나게 될까요?

이제

내가 초기화가 유지합니다 (*****의 확인)

- (void) tick: (ccTime) dt 
{ 

NSLog(@"%d",ticker); 
if(fbut.Adown == YES && ticker > 4)//fbut is a button 
{ 


    elayer = [[effectsLayer alloc] retain]; // *********each effectlayer draws //a projectile that moves forward 'x' ticks 

    elayer.e_playpos = glayer.playerpos; // player position 
    [self addChild:elayer z:2]; 

    [mutable addObject: elayer]; 
[elayer release]; 

    if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one. 
    { 
    NSLog(@"mutable: %d", mutable.count); 

    [mutable removeLastObject]; 
    } 

    ticker=0; 
} 
ticker++; 


// . . . 

을 이제 더 효과 레이어가 그려지지되고있다로 변경

여기에 다음 피클은 ...하지만, 여전히 NSArray는 21-20 개의 객체를 포함합니다. 이러한 모든 개체는 초기화되지 않습니다. 그래서 끝 부분에 init을 추가했습니다 : elayer = [[[effectsLayer alloc] retain] init];

이제 이전과 동일한 효과가 있습니다.

그래서 내가 오토 릴리즈 .. 같은 효과를 많이하고 퓨 퓨 퓨의 많은, 방법이 더 내 목표는 (20)는 한 번에 그려 질 alowed가와 20은 한 번입니다

(20)에 비해 시도 그 (것)들은 할당 해제된다. 지금 당장은 할당 해제를하지 않으면 약 2000 분의 e 레이어가 있고 약 5 프레임이 될 때까지 약 4 분이 지나야 프로그램이 정상적으로 실행됩니다.

왜 우주선이 갑자기 꺼지지 않습니까?

(BTW 내가적인 Cocos2D 프레임 워크를 사용하고 있습니다)이 날에 의해 저작권 프로젝트, 알렉스 earley 2009 년

답변

7

첫째, [[effectsLayer alloc] retain] 끔찍한입니다. 그러지 마. 이제까지. 초기화되지 않은 할당 된 객체를 절대로 사용하지 마십시오. 또한, + alloc에 ​​대한 호출이 유지 된 객체를 반환하고 다시 유지 한 다음 배열 (세 번째 시간을 보유)에 추가하기 때문에이 객체는 적어도 두 번 객체 을 유지합니다. (배열과 단수형 릴리스에서 제거 된 경우) 두 번 릴리스됩니다.

문제점이 다음 줄로 의심됩니다. [self addChild:elayer z:2];이 방법의 기능은 무엇입니까? 실제로 화면에 엘레어를 그리는 것이 담당입니까? 만약 그렇다면, 그것은 아마도 또한 elayer를 유지한다는 것을 의미합니다. 즉, 할당 해제되지 않은 것을 의미합니다. 가변 배열에서 항목을 팝핑 할 때 "removeChild"호출을하지 않는 것처럼 보이기 때문입니다.

간단히 말해서, 배열에 더 이상 존재하지 않는 것이 화면에도 표시되지 않는다는 의미가 아닙니다.

+1

'addChild : z :'가 객체를 유지하지 않지만 참조를 어떻게 든 유지한다고해도 계층을 자식으로 추가했음을 의미합니다.하지만'dealloc '이므로 언젠가 충돌 할 것입니다. 에드. – Chuck

+0

@Chuck +1 매우 사실입니다. –

+1

또한 'addChild :'에 저장하지 않으면 20 개 항목으로 제한되지 않고 충돌이 발생할 수 있습니다. – bobDevil