반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

Posted on . Written by


수요일 FAQ 시간이 다시 돌아 왔습니다. 아래 자주 반복되는 질문 5가지가 있습니다. 오늘은 Event Listeners와 Display Objects를 어떻게 remove 하는지에 대해 알아보겠습니다.


1. I’m confused about when I need to call removeEventListener?


대표적인 경우는 Runtime:addEventListener를 사용해서 이벤트 리스너를 생성했다면 Runtime:removeEventListener를 call 하셔야 합니다. 만약 object event listener를 생성했다면 그 object를 remove 할 때 object event listener도 remove 해야 합니다.


--------------------------
-- Runtime Listener
--------------------------

function myFrame( event )
    print( "enterFrame", event.time )
end

Runtime:addEventListener( "enterFrame", myFrame )

-- Some time later ...
Runtime:removeEventListener( "enterFrame", myFrame )

--------------------------
-- Object Listener
--------------------------

local rect = display.newRect(10, 40, 100, 50)

function rect:touch( event )
    if event.phase == "began" then
        print( "Rect touched", event.target )
    end
end

rect:addEventListener( "touch" )

-- Some time later ...
rect:removeSelf()
rect = nil


 



2. I see code using “self”. What is that?


self 는 루아 메소드의 hidden 파라미터 입니다. 함수를 call 할 때 그 object에 접근하기 위해 사용하죠. 아래에 그 예제가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
function rect1.touch( self, event )
    if event.phase == "began" then
        print( "Rect1 touched", event.target, self )
    end
end

rect1:addEventListener( "touch" )


local rect2 = display.newRect(10, 160, 100, 50)
function rect2:touch( event )
    if event.phase == "began" then
print( "Rect2 touched", event.target, self )
    end
end

rect2:addEventListener( "touch" )
 

두 예제의 메소드 모두 제대로 작동합니다. 그런데 하나는 "." 를 사용했고
다른 하나는 ":"를 사용했습니다.

콜른(:)을 사용하면 메소드에 hidden self 파라미터를 전달합니다.
그리고 점(.) 을 사용한 것은 이 self를 전달하지 않습니다.
그러니까 점을 사용하면 반드시 첫번째 파라미터로 self를 전달해야 합니다.

코로나는 다른 많은 Display Object API들에 (e.g., object:removeSelf, object:setFillColor, etc.) 이 Lua 기능을 사용하고 있습니다.


이벤트 리스너와 self 를 사용하는 것은 그렇게 유용하지 않을 겁니다. 왜냐하면 대부분의 object listener들은 객체의 handle을 지원하기 위해  event.target 파라미터를 제공하기 때문이죠. 이 파라미터는 self와 같습니다. 여러분이 만든 메소드에는 이 self를 사용할 수 있을 겁니다. 여러 객체에서 같은 메소드를 call 할 때 아주 유용하겠죠.


3. Do I really need to set display objects to nil after I remove them?


그 객체와 관계된 Lua 메모리를  clean up 하기 위해 사용하지 않는 객체에 nil을 할당해야 합니다. display object를 remove 할 때마다 (object:removeSelf) 그 객체의 texture 메모리와 관련된 메소드 그리고 그 객체와 관련된 이벤트 핸들러들은 remove 될 겁니다.  그렇게 되면 그 객체는 일반적인 Lua 테이블로 됩니다. 여기에 nil을 할당함으로서 그 테이블에 대한 reference 까지 remove 하게 됩니다. 그리고 나서 Lua Garbage Collector에 의해 그 테이블이 사용했던 메모리가 free 됩니다.


4. What is the best way to remove display objects from a Display Group?


display group에서 removeSelf 를 하면 그 그룹의 모든 display object들을 remove 할 겁니다. 그 그룹의 각 객체별로 따로따로 removeSelf  할 필요는 없습니다. group에 있는 객체들을 따로 nil 처리할 필요는 없습니다. 그룹 안에 있는 객체가 다른 변수에 의해 reference 된다면 그 variable을 nil로 세팅해야 합니다.


5. How can I tell if a display object was removed?


display object는 table입니다. 그리고 그것과 연관된 texture memory와 메소드들이 있죠. 그러니까 어떤 display object 메소드가 그 object와 아직까지 연관이 돼 있는지 여부를 체크함으로서 해당 display object가 아직까지 존재하는지를 알아 낼 수가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
if type( rect1.setFillColor ) == "function" then
print( "rect is still a display object" )
end


위 예제는 rect1 객체에 setFillColor 메소드를 적용할 수 있는지 여부를 체크하고 있습니다.
어떤 객체에 removeSelf 를 call 하면 그 객체로부터 모든 메소드가 removed 된다는 것을 기억해 두세요.

여기까지가 이번주 QNA 내용이었습니다.

즐거운 주말 되세요.



반응형