2011-04-11 6 views
10

메모리 경고를받은 직후에 Monotouch 응용 프로그램이 충돌하는 문제가 있습니다. 아래의 스택 추적을 참조하십시오.ViewController ::. ctor (System.IntPtr)에 대한 생성자가 없습니다.

 
Received memory warning. Level=2 
DTMobileIS[2299] : _memoryNotification : { 
     OSMemoryNotificationLevel = 2; 
     timestamp = "2011-04-11 14:29:09 +0000"; 
    } 
Toplevel exception: System.MissingMethodException: No constructor found for Myapp.UI.BoardController::.ctor(System.IntPtr) 
    at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x00000] in :0 
    at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in :0 
    at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObject (IntPtr ptr) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObjectWrapped (IntPtr ptr) [0x00000] in :0 
    at (wrapper native-to-managed) MonoTouch.ObjCRuntime.Runtime:GetNSObjectWrapped (intptr) 
    at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in :0 
    at Myapp.Free.Application.Main (System.String[] args) [0x00000] in /Users/haakon/Code/Myapp-work/iOS/Myapp.Free/Myapp.Free/Main.cs:12 

스택 트레이스는 표시된 클래스 (a UIViewController 하위 인 BoardController가)는 파라미터를 IntPtr 복용 생성자 부족 올바른지. 그러나 이것은 어플리케이션에서 Interface Builder를 전혀 사용하지 않기 때문에 의도적 인 것입니다. 그런데 왜 이런 일이 일어 났습니까?

보기 (또는보기 가능 컨트롤러)가 가비지 수집되도록 허용하는 경우 발생할 수있는 비슷한 질문을 발견했습니다. 그러나 어떻게 이런 일이 일어날 지 모르겠습니다. 배경 : 내 응용 프로그램 대리인은 네비게이션 컨트롤러에 대한 강력한 참조를 보유하고 있으며 네비게이션 스택의 루트보기 컨트롤러에 대한 강력한 참조를 보유합니다. 이 루트보기 컨트롤러는 또한 BoardController 인스턴스에 대한 강력한 참조를 보유합니다. 그래서 BoardController가 어떻게 가비지 수집 될 수 있는지 이해하지 못합니다.

아이디어가 있으십니까?

답변

9

IntPtr 생성자는 네이티브 개체를 관리되는 개체에 표시해야 할 때 사용됩니다. 이 특정한 경우에, 당신은 다음과 같이 만들 수 있습니다 :

var foo = new Foo(); 
SomeObject.Property = foo; 

이이 속성에 푸 개체를 할당하지만 속성이 목표 - C 객체 인 경우, 당신은 참조를 유지하지 않는 경우 "foo는 ", 그러면 Mono의 GC는 관리되는 Foo와 관리되지 않는 Foo 사이의 연결을 처리합니다. 이 새로운 하나를 구성하는, 그래서 MonoTouch, 아니 관리되는 개체가에지도보다는 더 이상이 없다는 것을 알게 될 것이다, 여기에

var bar = SomeObject.Property; 

있지만, 모든 :

다음, 나중에, 당신은 그것을 검색하려고 Objective-C 코드에 대한 IntPtr이 있습니다. 이것이 생성자가 필요한 이유입니다.

당신은 기본 생성자를 추가하는 유혹 할 수 있으며이 많은 경우에 괜찮지 만, 개체 예를 들어 관리 세계에 저장된 자신의 상태가있는 경우이 문제가

:

public class Foo : UIView { 
    string Name; 
    public Foo() { Name= "Hello"; } 
    public Foo (IntPtr ptr) : base (ptr) {} 
} 

이 경우 IntPtr 생성자는 IntPtr에서 관리 대상 개체와 해당 상태를 완전히 재구성 할 수 없습니다. 따라서 문제의 원인은 개체에 대한 참조를 유지하지 않는다는 것입니다.

실제 수정 사항은 다음과 같습니다. 관리 코드에 BoardController에 대한 참조를 보관하여 나중에 나중에 사용하려고 할 때 개체가 수집되지 않도록합니다.

+0

고맙습니다. 당신. MIGUEL !!!! 나는 여러 해 동안이 문제와 씨름하고 있었다. 나는 약간의 펑키 한 nav/tab/single/dialog root view 컨트롤러가 로직 + 모달 컨트롤러를 변경하고 그 원인을 생각하면서 너무 오래 놀았다. 나는 예외적 인 메시지를 google에 오랫동안 가져 갔던 것을 도무 린다. .. 그러나 그것은 전부 완전한 감각을 지금 만든다! – Tyson

관련 문제