2014-11-18 2 views
3

방금 ​​AS3에서 중첩 된 기능을 발견했으며 (예, 파티에 늦음) Flex 프로젝트에서이 기능을 사용하고 있습니다. 필자는 본질적으로 eventListeners와 함께 모달 연산에 별도의 함수를 사용해야하는 것을 싫어했습니다. 코드에 혼란을 주며 연산 논리를 분리하고 로컬 변수를 쉽게 참조 할 수 없습니다.이벤트 리스너와 함께 중첩 된 함수를 사용하는 데 문제가 있습니까?

아래의 예는 디렉토리를 선택하는 사용자가 매우 잘 작동하는 것처럼 보입니다.하지만이 방법을 사용하는 데 문제가 있는지 궁금합니다. 또한 비모수 조작 (예 : Loader과 같은 비동기)에서는 중첩 함수를 사용할 수 있습니까?

 private var rootDirectory:File; 

     protected function rootBtn_clickHandler(event:MouseEvent):void 
     { 
      var tmp:File = File.desktopDirectory; 
      tmp.browseForDirectory("Set Project Folder"); 
      tmp.addEventListener(Event.SELECT, onUserSelect); 
      tmp.addEventListener(Event.CANCEL, onUserCancel); 

      function onUserSelect(event:Event):void 
      { 
       tmp.removeEventListener(Event.SELECT, onUserSelect); 
       tmp.removeEventListener(Event.CANCEL, onUserCancel); 
       rootDirectory = event.target as File; 
      } 

      function onUserCancel(event:Event):void 
      { 
       tmp.removeEventListener(Event.SELECT, onUserSelect); 
       tmp.removeEventListener(Event.CANCEL, onUserCancel); 
       trace("user canceled"); 
      } 
     } 
+0

함수의 범위를 알고 있고 메모리 누수가 발생하지 않도록하십시오. 괜찮습니다. Loader에서 사용할 수 있지만 일반적으로 가비지 수집되지 않도록 유지하는 유일한 리스너는 리스너 자체이므로 약한 리스너를 사용할 수 없으며 종료 할 때 리스너를 제거해야합니다. 그렇지 않으면 리스너가 그대로 유지됩니다. 영원히 기억. 대부분의 사람들은 AS3에서 멀리 떨어져 있습니다. (일반적으로 사람들에게 권장합니다.) 메모리 누출을 쉽게 만들거나 실수로 수집 한 가비지를 쉽게 가져올 수 있기 때문입니다. – BadFeelingAboutThis

+0

@LDMS - 감사합니다! 그것은 GC로 인해 약한 참조를 사용하지 않는 것에 대한 훌륭한 세부 사항이며 완전한 의미를가집니다. 이 게시물을 게시 한 후 Loader에서 중첩 된 함수를 사용하여 시도했지만 가능한 모든 이벤트를 처리하면 코드가 자체적으로 클래스가 될 정도로 커지지 만 문제가 없습니다. 하지만 사용자 응답을 처리하는 것과 같은 작은 작은 것들에 대해서는이 중첩 된 접근법을 정말 좋아합니다 (이벤트 리스너가 적다는 것을 싫어합니다.) –

답변

1

익명 또는 중첩 기능을 사용하는 경우 몇 가지주의 사항이있을 수 있습니다.

첫 번째 가장 중요한 가비지 컬렉션 : 당신의 예에서

이 유일한 것은 가비지 수집되지 않도록 tmp 개체를 유지는 SELECTCANCEL 청취자 자체입니다. 약한 플래그를 true로 설정하지 않으므로 문제가되지 않지만 약한 플래그 (tmp.addEventListener(Event.SELECT, onUserSelect,false,0,true))를 사용하는 경우 tmp 개체가 가비지 수집을 시작하기 전에 적절하게 변경됩니다. 또는 파일을 취소 할 수 있습니다.

또한이 방법으로 첨부 한 모든 수신기를 제거해야합니다. onUserCancel 메서드에서 그렇게하고 있으므로 정상적으로 처리해야하지만 그렇지 않은 경우에는 클릭 핸들러가 실행될 때마다 손에 메모리 누수가 발생하여 tmp의 다른 인스턴스가 만들어 지지만 절대로 청취자가 붙어 있기 때문에 가비지 수집.

요약하면 대부분의 사람들은 AS3의 익명/중첩 된 메소드에서 벗어나기 때문에 메모리 누수를 쉽게 만들거나 실수로 가비지 수집을 할 수 있기 때문에 일반적으로 사람들에게 권장합니다. 또한 성능 차이가있을 수도 있고 그렇지 않을 수도 있지만, 그런 점에서 테스트를 한 적이 없습니다.

+0

다시 한 번 감사드립니다! 좋은 정보. –

관련 문제