2012-04-13 5 views
0

MonoTouch가 메소드를 컴파일하지 않거나 호출하도록 지정된 컴파일 된 메소드를 찾을 수없는 것처럼 보이는 이상한 문제가 있습니다. 릴리스 구성의 디바이스에서만 - 디버그 빌드가 정상입니다. 운이 좋은 간단한 코드 샘플로 재현 해 보았습니다. 따라서 아래 코드로 동작을 볼 수 있을지는 의문입니다.MonoTouch는 신비하게도 메서드와 속성을 컴파일하지 않습니까?

using System; 
using MonoTouch.UIKit; 

public class MyClass 
{ 
    private UINavigationController _navController; 
    private UIViewControler _viewController; 

    public UINavigationController NavController 
    { 
     get 
     { 
      if (_navController == null) 
      { 
       if (_viewController == null) 
       { 
        _viewController = new UIViewController(); 
       } 
       _navController = new UINavigationController(_viewController); 
      } 
      return _navController; 
     } 
    } 
} 

을 그리고, 다른 방법으로 ...

public void SomeMethod() 
{ 
    MyClass myClass = new MyClass(); 
    var navController = myClass.NavController; // <-- This is where it throws 
} 

내가 얻는 예외가되는 표준의 JIT 컴파일 메시지, 그것은 JIT를 시도한다는 :하지만이 내가 뭘하는지 본질적으로 get_NavController(). 나는 가상 제네릭, LINQ가 없기 때문에 링커가 꺼져 있고 JIT를 일으키는 다른 것들은 관련되어 있지 않기 때문에 매우 이상하다고 생각한다. 또한 MyClass에 정의 된 다른 메서드 및 속성에는 throw하지만 생성자 또는 System.Object 상속 된 메서드에는 throw하지 않습니다. Reflection은 myClass.GetType().GetMembers()에 내가 기대하는 모든 것을위한 MemberInfo를 가지고 있음을 보여줍니다. 그러나 의 경우 릴리스 | iPhone에 대해서만 이러한 메서드 또는 속성에 액세스 할 수 없습니다. 필자가 볼 수있는 유일한 논리적 결론은 컴파일 컴파일 단계에서 누락 된 것이므로 릴리스 구성에서만 발생하지 않는 이유는 무엇인지 전혀 알지 못합니다.

제 질문은 그런 상황을 유발할 수있는 것이 무엇이며, 그것을 고칠 다음 단계는 무엇입니까? 여기서 디버깅을 할 때 어디로 가야할지, 버그를 파일화해야할지에 대해서는 잘 모르겠다. 왜냐하면 우리가 (훨씬) 더 큰 프로젝트의 맥락에서 그것을 재현 할 수 없기 때문이다.

업데이트 : 정확한 예외 텍스트가 요청되었습니다.

System.ExecutionException: Attempting to JIT compile method 
'MyNamespace.MyClass.get_NavController()' while running with --aot-only 
+0

"NavController"의 정의를 설명 할 수 있습니까? 그것은 방법이 아니며 (흉한 것은 없으며) "getter"도 아닙니다 (get 또는 set되지 않음). 그 모든 문제가 해결 될 수 있을까요? – Krumelur

+0

예, getter가있는 속성입니다. 내 생략을 수정하기 위해 코드를 업데이트했습니다. –

답변

1

이것은 여기에서 해결할 수있는 것처럼 보이지 않습니다.

더 작은 테스트 케이스를 만들 수없는 경우 버그를 제출하고 전체 프로젝트를 첨부하는 것이 좋습니다. 비공개 버그를 신고 할 수 있습니다. Xamarin 직원은 프로젝트를 공개적으로 볼 수 없으면 액세스 할 수 있습니다.

+0

전체 소스를 첨부 할 수있는 권한이 없지만 버그를 신고하고 바이너리를 첨부합니다. –

+1

원인을 찾아 냈습니다. MonoDevelop에는 iOS 앱인 어셈블리를 참조 할 때 버그가 있습니다. 컴파일러는 일반 컴파일 된 exe 대신 앱 번들 내에서 제거 된 어셈블리에 대한 경로를 제공합니다. 링크 : https://bugzilla.xamarin.com/show_bug.cgi?id=4530 –

0

당신은 내가이이 전혀 UIViewController.ViewDidLoad 메소드가 호출 될 때까지 기다릴 필요와 관련된 궁금 명시 적 또는 변수

UINavigationController navController = myClass.NavController; 

를 선언하려고 할 수 클래스의 내부가되지 않을 수 있습니다로 아직 초기화되지 않았습니까?

어둠 속에서 방금 촬영했는데, 코드가 작동하지 않는 이유를 생각할 수 없습니다.

+0

실제 코드에서 속성은 함수의 인수로 전달되지만, 사용 방법에 관계없이 throw됩니다. 어떤 코드도 뷰와 관련이 없으며, 컨트롤러와 과거에는 작동했습니다. 나는 그것이 언제 부서 졌는지 정확하게 추적하고있다. –

+0

저에게도 톱니 바퀴가 움직이고 있으며, 위에 제시된 코드가 실제 유죄의 범인이 아니며 런타임에 다른 것과 관련이있을 수 있음을 나타냅니다. 리플렉션을 사용하여 해당 메소드를 호출하고 있습니까? 솔직히 위의 코드가 어디에서나 명시 적으로 참조되지 않는다는 것을 제외하고는 iOS 컴파일러가 가능한 한 작은 실행 파일을 생성하기 위해 참조되지 않았으므로 코드를 제거한다는 점을 제외하고는 다른 이유를 생각할 수 없습니다. – AkiAki007

+0

질문에 언급 한 바와 같이, 속성은 리플렉션을 통해 호출되지 않습니다. –