필요없는 객체를 제거하고 변수를 처리하는것은 사소한 일 처럼 느껴지지만 코로나의 신규 개발자이든 경력이 있는 개발자이든 항상 질문하는 내용 중 하나입니다. 이 일을 처리한 결과 일어나는 일은 아주 간단합니다. 하지만 이 일을 제대로 처리하지 않아서 일어나는 메모리 손실이나 속도저하 그리고 crash 같은 것들은 아주 큰 영향을 미칩니다.
Removing display objects
이것을 잘못 사용할 수 있는 경우는 단지 그 객체가 스크린에서 없어지느냐 아니면 앞으로 더 이상 사용될 필요가 없는것이냐를 구분해야 되는데 있습니다. 객체에 어떤 참조를 store하기 위해 사용했던 변수는 skeleton 테이블을 가지고 있습니다. 그것은 객체를 remove 한 이후에도 계속 있게 됩니다. 여러분이 object:removeSelf()를 하시고 난 후 그 변수를 print 하면 어떻게 될까요?
-- create the object
local object = display.newImage( "image.png" )
-- remove the object
object:removeSelf()
print( object )
object:removeSelf() 문서에서 예제 부분을 보시면 아래와 같이 변수에 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 outcast = display.newImage( "image.png" )
outcast.x, outcast.y = 160, 240
end
create_and_abandon()
위 예제에서 create_and_abandon() 함수는 간단히 하나의 객체를 생성하고 (로컬변수를 사용해서) 그 객체의 위치를 설정해 주는 일을 합니다. 이 함수의 마지막 end 부분에서 이 outcast 변수는 더 이상 access 될 수 없게 됩니다. 그 객체를 내버려 두고 떠나서 더이상 다뤄지거나 remove 될 수 없게 되는 겁니다.
이러한 상황을 방지하기 위해서는 이 변수 선언을 함수 블럭 바깥에서 선언하셔야 합니다. 아래에 그 예제가 있습니다.
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 이 아닌 겁니다. 그래서 함수가 다 실행되고 나서도 이 변수를 우리가 접근해서 컨트롤 할 수 있는 겁니다.
좀 더 많은 정보를 완하시면 Display Objects and Stage 가이드의 Removing Objects Properly 섹션을 보세요.
'Corona SDK > Corona Doc' 카테고리의 다른 글
화면 전환 하면서 state(상태) 관리하기 (0) | 2012.08.09 |
---|---|
Storyboard: Scene Purging vs. Removal (0) | 2012.08.02 |
Tap 이벤트로 간단하게 touch 감지하기 (0) | 2012.07.26 |
System Events 사용해서 앱의 현 상태 저장하기 (0) | 2012.07.20 |
Best Practices for Organizing Projects (2) | 2012.07.11 |
How to Use Custom Events in Corona (0) | 2012.06.28 |
Corona API Reference 제대로 활용하기 (2) | 2012.06.22 |
Transitions로 기본적인 Animation 적용하기 (2) | 2012.06.18 |
Local Notifications Guide (iOS) (0) | 2012.06.06 |
비트맵 마스크 사용하기 (2) | 2012.06.02 |