AS3.0에서 용기 안의 하위 대상을 삭제하는 오류를 반복합니다

1897 단어 as3
왜 색인이 범위를 초과합니까?코드를 다시 분석해 봅시다.num은 확실히 고정되어 있지 않지만 a.removeChildAt(i).문제는 as3의 새로운 깊이 관리 메커니즘 때문에 첫 번째 순환을 실행한 후 깊이가 0인 대상이 삭제되고 깊이가 1-5인 대상의 깊이가 자동으로 1로 줄어들기 때문이다.따라서 깊이가 0인 위치에는 여전히 대상이 존재한다.세 번 순환하면 a.numChidlren은 3, i는 3이 된다.네 번째 순환을 실행할 때 오류가 발생합니다. 색인이 세 자리인 대상을 찾을 수 없기 때문입니다.이런 생각을 검증하기 위해 다음 코드를 실행합니다.

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->a1.name="a1";
a2.name="a2";
a3.name="a3";
a4.name="a4";
a5.name="a5";
a6.name="a6";
var num=a.numChildren;
try{
    for(var i:uint=0;i<num;i++){
        a.removeChildAt(i);
    }
}catch(e){}
for(var j:uint=0;j<a.numChildren;j++){
    trace(a.getChildAt(j).name)
}

각각 a에 있는 하위 대상마다name 속성을 추가하고 삭제를 실행한 후 a에 존재하는 대상의name를 출력합니다.출력 결과 a2, a4, a6 발견.
이것은 삭제하기 전에 깊이가 홀수인 대상이 삭제되었다는 것을 의미한다. (왜 깊이가 홀수인 대상만 삭제되었는지, as3의 깊이 관리 체제에 따라 추측해 보면 알 수 있다) 만약에 as3에 이런 깊이 관리 체제가 있다면 아무리 삭제해도 깊이가 0인 대상은 항상 존재한다.코드를 바꾸다

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->var num=a.numChildren;
for(var i:uint=0;i<num;i++){
    a.removeChildAt(0);
}
trace(a.numChildren);

하면 됩니다. 트레이스의 결과는 0이고 a의 하위 대상이 모두 삭제되었음을 알 수 있습니다.
주의: 절대 for(var i:uint=0;i

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->while(a.numChildren>0){
    a.removeChildAt(0);
}


실제로 저는while로 삭제하는 방법을 본 후에야 제가 예전에 for로 삭제하는 문제를 발견했습니다. 여러분은 가장 마지막 방법으로 쓰는 것을 권장합니다. 이렇게 쓰는 코드가 가장 간단합니다.

좋은 웹페이지 즐겨찾기