페이지

2013년 6월 27일 목요일

AOT 컴파일러 와 Generic type 사용

사용 언어: C#

오늘 문제가 됐던 버그가 iOS버전으로 빌드를 하니 제네릭 클래스 타입을 사용하는 부분에서 crash가 생겼다. 안드로이드 버전에서는 문제가 안됐었는데 iOS버전에서만 crash가 나는 것이었다.

처음엔 원인을 몰라 당황했는데 유니티 트러블 슈팅 관련 문서를 읽어보니. 눈에 띄는 것이 있었다. "AOT": 현재 XCode에서 사용하는 컴파일 방식인데 이 방식은 JIT랑은 다른 형식의 컴파일 형태이다. 두 컴파일 방식에 대한 차이는 이곳 에서 확인 할 수 있다.

AOT방식에 사용제한이 있는데 generic parameter을 사용할때 explicit 한 type만 사용가능하다. 그래서 현재 프로젝트에서 generic type 을 generic container에 인자로 사용하자 크래쉬가 발생한 것이다.

해결한 방법으로는 현재 레퍼런스 타입을 받으므로 Systme.Object 를 인자로 받게 하고 다시 값을 얻어올때 generic type으로 캐스팅하도록 하였더니 이 문제를 해결 할 수 있었다.

문제가 됐던 코드 방식은 이것:

public class Test<T> : MonoBehaviour where T : Test<T>
{
        private Dictionary<int, T> m_test = new Dictionary<int, T>();

        public void foo()
       {
               Test<T> test = m_test[0];
       }    
}


해결 코드는 이것:

public class Test<T> : MonoBehaviour where T : Test<T>
{
        private Dictionary<int, System.Object> m_test = new Dictionary<int, System.Object>();

        public void foo()
       {
               Test<T> test = (Test<T>)m_test[0];
       }    
}


댓글 없음:

댓글 쓰기