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

최근에 받은 트랙백

글 보관함


Posted on . Written by

필요없는 객체를 제거하고 변수를 처리하는것은 사소한 일 처럼 느껴지지만 코로나의 신규 개발자이든 경력이 있는 개발자이든 항상 질문하는 내용 중 하나입니다. 이 일을 처리한 결과 일어나는 일은 아주 간단합니다. 하지만 이 일을 제대로 처리하지 않아서 일어나는 메모리 손실이나 속도저하 그리고 crash 같은 것들은 아주 큰 영향을 미칩니다.


Removing display objects


코로나 display object(그리고 다른 타입들의 객체들)은 object:removeSelf()메소드를 사용해서 remove될 수 있습니다. 이 메소드를 call 하는 것은 쉽습니다. 이 메소드를 call 해서 얻어지는 결과는 현재 보이는 객체가 보이지 않게 되므로 확인하는것도 쉽습니다. 

이것을 잘못 사용할 수 있는 경우는 단지 그 객체가 스크린에서 없어지느냐 아니면 앞으로 더 이상 사용될 필요가 없는것이냐를 구분해야 되는데 있습니다. 객체에 어떤 참조를 store하기 위해 사용했던 변수는 skeleton 테이블을 가지고 있습니다. 그것은 객체를 remove 한 이후에도 계속 있게 됩니다. 여러분이 object:removeSelf()를 하시고 난 후 그 변수를 print 하면 어떻게 될까요?


-- create the object
local object = display.newImage( "image.png" )

-- remove the object

object:removeSelf()

print( object )



이 변수는 여전히 table value를 가지고 있는것을 보실 수 있습니다. 그러니까 아직까지 그 변수는 empty 가 아닌겁니다. 그 의미는 이 변수가 아직 메모리를 차지하고 있다는 것이고 여러분이 Lua 에게 이 변수는 더 이상 사용하지 않을 것이라는 것을 말해야 된다는 것을 의미합니다. 그 다음에야 clean up 할 수 있죠. 그 방법은 그 변수에 nil을 할당해주기만 하면 됩니다. 그러면 그 변수를 완전하게 remove 하게 되는 겁니다.


object:removeSelf() 문서에서 예제 부분을 보시면 아래와 같이 변수에 nil을 할당하는 부분을 보실 수 있을 겁니다.


object = nil

다른 객체를 참조하고 있는 살아있는 변수를 없애는데도 이와 똑같이 해 주시기만 하시면 됩니다. 살아있는 변수의 의미는 자동적으로 clean up 되지 않는 글로벌 변수이든지 로컬 변수이든지 어떤 객체에 대한 참조를 하고 있어서 완전하게 remove 되어야 할 필요가 있는 변수를 말하는 겁니다.




Local variable gotcha


I touched on it already, but local variables (that is, variables that are declared with the word local preceding the variable name), get cleaned up automatically at the end of their block of code.

로컬 변수는 그 변수를 감싸고 있는 블럭이 사용되지 않는 순간에 자동적으로 clean up 됩니다.


즉 여러분이 어떤 객체를 어떤 독립된 블럭 안에서 생성했다면 이 함수가 실행되고 난 후에 그 객체는 자동적으로 remove 된다는 겁니다. (그 변수 선언은 앞에 local 이 붙어야 합니다.) . 그렇게 remove 되면 여러분은 그 변수에 다시 access할 수 없게 되죠.


아래 그 예제가 있습니다.


local function create_and_abandon()
    local outcast = display.newImage( "image.png" )
    outcast.x, outcast.y = 160, 240
end

create_and_abandon()


위 예제에서 create_and_abandon() 함수는 간단히 하나의 객체를 생성하고 (로컬변수를 사용해서) 그 객체의 위치를 설정해 주는 일을 합니다. 이 함수의 마지막 end 부분에서 이 outcast 변수는 더 이상 access 될 수 없게 됩니다. 그 객체를 내버려 두고 떠나서 더이상 다뤄지거나 remove 될 수 없게 되는 겁니다.

이러한 상황을 방지하기 위해서는 이 변수 선언을 함수 블럭 바깥에서 선언하셔야 합니다. 아래에 그 예제가 있습니다.


local outcast  -- forward declaration

local function create_and_abandon()

    outcast = display.newImage( "image.png" )
    outcast.x, outcast.y = 160, 240
end

create_and_abandon()


-- we can now remove the object

outcast:removeSelf()
outcast = nil



이 예제에서는 이 함수가 끝난 이후에도 우리는 outcast 변수에 access 할 수 있게 됩니다.  객체를 생성할 때 local 이 빠져있죠? 단지 블럭 바깥에서 변수를 생성할 때 local을 붙였습니다. 이 의미는 이 변수가 그 블럭내의 local 이 아니라는 거죠. 이 outcast 변수는 local 변수 입니다. 단지 저 함수 블럭 내의 local 이 아닌 겁니다. 그래서 함수가 다 실행되고 나서도 이 변수를 우리가 접근해서 컨트롤 할 수 있는 겁니다.


여기까지가 코로나에서 변수나 객체를 remove 하는데에서 알아야할 내용 전부 입니다. 이 튜토리얼에 있는 내용은 아주 중요한 부분 입니다. 코로나를 새로 접하시는 분들이 항상 혼동을 일으키는 부분입니다. 이 부분을 잘 이해하셔서 여러분 앱에서 hard-to-trace 문제를 일으키지 않도록 주의하셔야 합니다.

좀 더 많은 정보를 완하시면 Display Objects and Stage 가이드의 Removing Objects Properly  섹션을 보세요.


반응형

Comment